天天看點

C++11的模闆新特性-變長參數的模闆

這個特性很贊,直接給例子吧,假如我要設計一個類,CachedFetcher内部可能使用std::map也可能使用std::unordered_map,也可能是其它的map,怎麼設計呢?沒有C++11變長模闆之前這很費勁。。 因為map的模闆參數可不是隻有key,value兩個啊,還有一些有預設參數的template參數。。。

template<typename _Key, typename _Value,

template<class _Kty, class _Ty, typename...> class _Map = std::unordered_map>

class CachedFetcher

{

public:

typedef _Key Key;

typedef _Value Value;

typedef _Map<Key, Value> Map;

typedef typename Map::iterator iterator;

typedef typename Map::const_iterator const_iterator;

private:

Map _map;

};

另外一個比較好的特性

template<typename _Key, typename _Value,

template<class _Kty, class _Ty, typename...> class _Map = std::map>

class LruMap

{

};

template <typename Key, typename Value, typename...>

using LruHashMap = LruMap<Key, Value, std::unordered_map>;

最後非模闆的一個有用特性,複用基類的構造函數

class FeatureVector : public Vector

{

public:

~FeatureVector() = default;

FeatureVector(FeatureVector&&) = default;

FeatureVector& operator = (FeatureVector&&) = default;

FeatureVector(const FeatureVector&) = default;

FeatureVector& operator = (const FeatureVector&) = default;

#ifndef GCCXML

using Vector::Vector;

#endif

}