模板和重载
template<class Key1, class Key2, class Type> class DualMultimapCache
{
public:
std::list<std::reference_wrapper<Type>> get(Key1 const & key);
std::list<std::reference_wrapper<Type>> get(Key2 const & key);
template<class ...Args> Type & put(Key1 const & key, Args const & ...args);
template<class ...Args> Type & put(Key2 const & key, Args const & ...args);
};
在这里,我有一个类的公共接口。 底层的数据结构并不重要。 当Key1
和Key2
属于不同类型时,一切都会正常工作。 如果它们最终成为相同的类型,那么过载可能是不可能的。 我对此有何想法?
如果我是,有没有办法在保持签名尽可能干净的情况下将重载分开?
编辑:这里更深入的示例
template<class Key1, class Key2, class Type> class DualMultimapCache
{
public:
std::list<std::reference_wrapper<Type>> get(Key1 const & key);
std::list<std::reference_wrapper<Type>> get(Key2 const & key);
template<class ...Args> Type & put(Key1 const & key, Args const & ...args);
template<class ...Args> Type & put(Key2 const & key, Args const & ...args);
private:
std::unordered_multimap<Key1, std::reference_wrapper<Type>> map_Key1;
std::unordered_multimap<Key2, std::reference_wrapper<Type>> map_Key2;
};
template<class Key1, class Key2, class Type>
std::list<std::reference_wrapper<Type>> DualMultimapCache<Key1, Key2, Type>::get(Key1 const & key)
{
auto its = map_Key1.equal_range(key);
if (its.first == map.cend() && its.second == map.cend())
throw std::out_of_range();
else
return { its.first, its.second };
}
template<class Key1, class Key2, class Type>
std::list<std::reference_wrapper<Type>> DualMultimapCache<Key1, Key2, Type>::get(Key2 const & key)
{
auto its = map_Key2.equal_range(key);
if (its.first == map.cend() && its.second == map.cend())
throw std::out_of_range();
else
return { its.first, its.second };
}
对于相同密钥类型的情况,您可以部分专门化模板,例如
template <typename Key, typename Type>
class DualMultimapCache<Key, Key, Type>
{
public:
std::list<std::reference_wrapper<Type>> get(Key const & key);
template<class ...Args> Type & put(Key const & key, Args const & ...args);
};
我认为你必须使用2个参数进行部分特化,但这样做不方便,因为你必须使用稍微不同的接口。 为了解决这个问题,我建议使用SFINAE
template<typename Key1, typename Key2, typename Type,
typename Enable = void > class DualMultimapCache
{
public:
std::list<std::reference_wrapper<Type>> get(Key1 const & key);
std::list<std::reference_wrapper<Type>> get(Key2 const & key);
template<class ...Args> Type & put(Key1 const & key, Args const & ...args);
template<class ...Args> Type & put(Key2 const & key, Args const & ...args);
};
template<typename Key1, typename Key2, typename Type > class DualMultimapCache < Key1, Key2, Type,
typename std::enable_if<std::is_same<Key1, Key2>::value>::type >
{
public:
std::list<std::reference_wrapper<Type>> get(Key1 const & key);
template<class ...Args> Type & put(Key1 const & key, Args const & ...args);
};
你可以使用3个模板参数的单一界面,但获得不同的专业化:
DualMultimapCache<int, double, int> t1; // DualMultimapCache template impl
DualMultimapCache<int, int, int> t2; // DualMultimapCache template
// specialization impl
链接地址: http://www.djcxy.com/p/40989.html