C++ 如何将实际类型的auto传递到模板中

C++ 如何将实际类型的auto传递到模板中,c++,class,templates,c++14,C++,Class,Templates,C++14,所以我举个例子 auto a = getMyTuple(); 这将最终成为真正的std::tuple类型 现在我想把它存储在一个有模板的类中,因为我还不知道它的类型。类似于 template<typename T> class my_tuple { public: T mt; my_tuple(T t) { mt = t; } }; 模板 给我的元组分类 { 公众: T-mt; 我的元组(T) { mt=t; } }; 我的问题是,有没有办法获取a

所以我举个例子

auto a = getMyTuple();
这将最终成为真正的std::tuple类型

现在我想把它存储在一个有模板的类中,因为我还不知道它的类型。类似于

template<typename T>
class my_tuple
{
  public:
  T mt;

  my_tuple(T t)
  {
    mt = t;
  }
};
模板
给我的元组分类
{
公众:
T-mt;
我的元组(T)
{
mt=t;
}
};
我的问题是,有没有办法获取auto返回的类型,这样我就可以像这样将其传递到模板类中

my_tuple<getType(a)> myTup(a);
mytuple myTup(a);

这就是
decltype
的作用:

my_tuple<decltype(a)> myTup(a);
mytuple myTup(a);
您想要的(从C++11开始):

mytuple myTup(a);

您可以实现一个工厂函数,该函数将以与构造相同的方式构造对象

(简化版,请参阅上面链接中的更合理版本或您最喜欢的标准库源代码)

模板
my_tuple my_make_tuple(T){
返回我的元组(t);
}
auto myTup=my\u make\u tuple(a);
将自动计算出类型,因此您不再需要担心显式类型。 他们在标准库中就是这样做的

请看斯蒂芬·T·拉瓦维(Stephan T.Lavavej)的这篇演讲:(下半部分)

更新: 我认为使用
decltype
发布的解决方案很难看,而且容易出错,因为变量名重复(违反规则)。此外,
decltype
在这里是不必要的,因为可以使用函数包装器自动推断类型。最后,如果元组有25个参数,您会写
decltype
25次吗?如果您不小心混淆了类型顺序和参数顺序,该怎么办?

哇,这比预想的容易多了!感谢您的快速回复!根据下一次会议的投票情况,C++17可能会允许类似于
my_tuple myTup(a)的内容与。@chris这是个好消息!
my_tuple<decltype(a)> myTup(a);
template <typename T>
my_tuple<T> my_make_tuple(T t) {
    return my_tuple<T>(t);
}

auto myTup = my_make_tuple(a);