所以我有一些例子
auto a = getMyTuple();
最终将是真正的std :: tuple<(some args)>
现在我想将它存储在一个有模板的类中,因为我还不知道它的类型。
的内容template<typename T>
class my_tuple
{
public:
T mt;
my_tuple(T t)
{
mt = t;
}
};
我的问题是,有没有办法获取auto返回的类型,所以我可以将它传递给模板类,如
my_tuple<getType(a)> myTup(a);
答案 0 :(得分:8)
那是decltype
的用途:
my_tuple<decltype(a)> myTup(a);
答案 1 :(得分:3)
你想要decltype
(自C ++ 11以来):
my_tuple<decltype(a)> myTup(a);
答案 2 :(得分:0)
您可以实现构建对象的工厂函数,与std::make_tuple()
构造std::tuple
的方式相同。
<子> (简化版,请在上面的链接或您喜欢的标准库的源代码中查看更合理的版本) 子>
template <typename T>
my_tuple<T> my_make_tuple(T t) {
return my_tuple<T>(t);
}
auto myTup = my_make_tuple(a);
Function call template argument deduction会自动计算出类型,因此您不必再担心显式类型了。 这就是他们在标准库中的表现。
请参阅Stephan T. Lavavej的演讲:Don’t Help the Compiler(朝向后半部分)
<子>
的更新强>
我认为由于重复变量名称(违反DRY principle),发布decltype
的解决方案很难看并且容易出错。此外,此处不需要decltype
,因为可以使用函数包装器自动推导类型。最后,如果你的元组有25个参数,你会写decltype
25次吗?如果您不小心混合了类型的顺序和参数的顺序怎么办?
子>