Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 是否可以在C+;中创建完全任意的私有成员元组+;11可变类构造函数?_Templates_C++11_Constructor_Variadic Templates_Variadic - Fatal编程技术网

Templates 是否可以在C+;中创建完全任意的私有成员元组+;11可变类构造函数?

Templates 是否可以在C+;中创建完全任意的私有成员元组+;11可变类构造函数?,templates,c++11,constructor,variadic-templates,variadic,Templates,C++11,Constructor,Variadic Templates,Variadic,如果之前有人问过这个问题,我表示歉意,但没有明确的答案,我开始怀疑这是否可能。我试图学习C++11,但在使用可变模板时遇到了麻烦。我想我(最终)掌握了可变函数参数的概念,以及为什么/如何使用递归来展开和处理它们,但在类构造函数中遇到了(我认为)类似概念的问题 假设我想创建一个可变模板类,它有一个混合类型容器(假设tuple)作为私有成员。在构建类对象时,是否可以将任意数量的不同类型的对象推入该元组?比如: #include <tuple> // forward declaratio

如果之前有人问过这个问题,我表示歉意,但没有明确的答案,我开始怀疑这是否可能。我试图学习C++11,但在使用可变模板时遇到了麻烦。我想我(最终)掌握了可变函数参数的概念,以及为什么/如何使用递归来展开和处理它们,但在类构造函数中遇到了(我认为)类似概念的问题

假设我想创建一个可变模板类,它有一个混合类型容器(假设tuple)作为私有成员。在构建类对象时,是否可以将任意数量的不同类型的对象推入该元组?比如:

#include <tuple>

// forward declaration - is this needed?
template <class ... args>
class myClass;

template <class H, class ... T>
class myClass <H, T ...>
{
 private:
     std::tuple<anything can go here> mycontainer;
 public:
     myClass(const H& head, const T& ... tail)
     {
            push head into mycontainer;
            do some sort of recursion with tail;
     }
}
#包括
//远期申报-是否需要?
模板
类myClass;
模板
类myClass
{
私人:
std::元组mycontainer;
公众:
myClass(常数H和头部,常数T和尾部)
{
将头部推入mycontainer;
用tail做一些递归;
}
}
我一直在和std::tuple_cat和std::make_tuple混在一起,我想我已经有一段时间了,但运气不好

我和C++有很长一段时间了,所以如果我完全不懂我的道歉。在阅读了一些关于C++11特性的文章之后,我才开始研究这个问题


编辑:只需添加我在GCC 4.8.x和/或Visual Studio 2012上是的,可以从这些可变类型中构造成员。例如:

template <class ... T>
class myClass {
  std::tuple<T...> mytuple;
public:
  // Constructor that takes const refs to the Ts and constructs tuple:
  myclass(const T&... args) : mytuple(args...) {}

  // Perfect forwarding constructor that will try to construct tuple
  // from arbitrary lvalue/rvalue parameters:
  template <class... Args>
  myclass(Args&&... args) : mytuple(std::forward<Args>(args)...) {}
};
模板
类myClass{
std::tuple mytuple;
公众:
//将常量引用带到Ts并构造元组的构造函数:
myclass(常量T&…args):mytuple(args…{}
//完美的转发构造函数,将尝试构造元组
//从任意左值/右值参数:
模板
myclass(Args&&…Args):mytuple(std::forward(Args)…{}
};

如果您要求更具体的内容,您必须对其进行更详细的描述。

请注意,VS2012的发行版不支持可变模板:如果您想要VS中的可变模板,您需要获得2012年11月CTP编译器发行版或VS2013预览版。@Casey:谢谢。我会得到2013年的预览。谢谢;我需要仔细阅读一下完美的转发构造函数。我想我远没有像我想的那样做好准备。使用这种方法,似乎可以实现一个myclass.get(int),它将使用std::tuple的get(int)函数,如下所示:
auto get(int-element)->decltype(mytuple.get(element)){return mytuple.get(element);}
,但这看起来很笨拙。正确的方法是什么?哎呀,我的意思是std::get(mytuple)好吧,糟糕,我完全迷路了。阅读时间@凯西:谢谢你的领先。你有什么理由选择向前移动而不是向前移动?