【发布时间】:2018-05-25 02:25:48
【问题描述】:
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 };
}
【问题讨论】:
-
是否允许使用
DualMultimapCache<T, T, Foo>?如果没有,只需static_assert(!std::is_same<Key1, Key2>::value, "")。 -
对
get(/put) 使用不同的名称?get_from_key1/get_from_key2? -
@MadScientist 这是我正在使用的案例......事实上,它很可能是标准用例。
-
@Jarod42 这就是我想的解决方案,但是不完成我其他类的相同界面会感觉很奇怪。
标签: c++ templates overloading overload-resolution class-template