【发布时间】:2014-08-12 20:22:57
【问题描述】:
今天,在第 100 次使用同一个模板时,我想到了引入一个简单替换的想法。
代替
QHash<int,QHash<int,QHash<int,int> > >
现在应该是:
MultiKeyHash<int,int,int,int>
(不要与 QT 的 QMultiHash 类混淆)。
前三个参数是键的类型,最后一个参数是值的类型。
MultiKeyHash<TKey1,TKey2,....,TKeyN,TValue>
我当前的实现如下所示:
template <typename... Args>
struct MultiKeyHash;
template <typename TKey1, typename... Args>
struct MultiKeyHash<TKey1, Args...> : QHash<TKey1,MultiKeyHash<Args...> > {
typedef typename MultiKeyHash<Args...>::ValueType ValueType;
const ValueType& value(const TKey1 &key1, const Args_Without_Last&... args) const {
return operator[](key1).value(args...);
}
};
template <typename TKeyN, typename TValue>
struct MultiKeyHash<TKeyN,TValue> : QHash<TKeyN,TValue> {
typedef TValue ValueType;
};
在我想添加“值”方法之前,一切都按预期工作。我当然不能使用“Args”作为第二个参数(-pack)的类型。我是否必须为其制作一个函数模板,或者有什么办法吗?
我必须如何定义“值”方法才能像这样调用它:
value(key1,key2,...,keyn)
【问题讨论】:
-
如果你可以改变你的设计/要求,使值类型成为模板的第一个参数,你就不需要弄清楚
Args_Without_Last。 -
value不应该通过引用返回吗?返回多级哈希表的副本似乎很昂贵。我假设您在返回类型上省略了&,并且您无意使用“返回常量值”反模式。 -
@KerrekSB
Args的最后一个元素是值类型,而不是键类型之一。 -
@Casey:啊,当然。
-
@RSahu 不错的想法。也许我可以将值类型作为第一个参数,并用另一个模板反转参数顺序...
标签: c++ templates c++11 variadic-templates