如何将真实类型的auto传递给模板

时间:2016-05-16 03:14:19

标签: c++ class templates c++14

所以我有一些例子

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);

3 个答案:

答案 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次吗?如果您不小心混合了类型的顺序和参数的顺序怎么办?