【问题标题】:Is it possible to create a completely arbitrary private member tuple in a C++11 variadic class constructor?是否可以在 C++11 可变参数类构造函数中创建一个完全任意的私有成员元组?
【发布时间】:2013-07-18 05:04:12
【问题描述】:

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

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

#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;
     }
}

我一直在搞砸 std::tuple_cat 和 std::make_tuple 并认为我有一段时间在做某事,但没有运气。

我已经很久没有与 C++ 有任何关系了,所以如果我完全疯了,我深表歉意。在阅读了一些关于 C++11 的特性之后,我才开始研究这个。

编辑:只需添加我使用的是 GCC 4.8.x 和/或 Visual Studio 2012

【问题讨论】:

  • 请注意,VS2012 的发行版不支持可变参数模板:如果您想在 VS 中使用可变参数,则需要获得 2012 年 11 月的 CTP 编译器版本或 VS2013 预览版。
  • @Casey:谢谢。我会得到 2013 年的预览版。

标签: templates c++11 constructor variadic-templates variadic


【解决方案1】:

是的,可以从这些可变参数类型中构造一个成员。例如:

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.get(int) ,它将使用 std::tuple 的 get(int) 函数,如下所示:auto get(int element) -&gt; decltype(mytuple.get(element)) { return mytuple.get(element); } 但这似乎很笨拙。正确的方法是什么?
  • 哎呀,我的意思是 std::get(mytuple)
  • 好吧,我的错,我完全迷路了。阅读时间! @Casey:感谢您的领先。
  • 你选择forward而不是move有什么原因吗?
猜你喜欢
  • 2011-06-28
  • 2018-09-03
  • 2021-04-25
  • 1970-01-01
  • 2021-11-15
  • 2016-06-23
  • 2012-10-01
  • 2019-08-04
  • 1970-01-01
相关资源
最近更新 更多