【问题标题】:unpacking into variadic constructor解压成可变构造函数
【发布时间】:2015-10-08 11:57:30
【问题描述】:

我有一个类 TensorMap(eigen3 库),它采用(此处简化)数字列表:

class TensorMap{
public:
   template<typename... T>
   TensorMap(T&...i){}
} ;

和一个使用这种类型的结构A

struct A{
    template<unsigned int N>
    A( NumberList<N> & idx ): m( /* idx(0),idx(1), ...., idx(N-1) */ ) ) {}

    TensorMap m;
};

如何将数字列表NumberList&lt;N&gt; &amp; idx 注入可变参数构造函数。 idx的号码访问由operator()(int i)完成。 这可以通过一些漂亮的模板递归实现吗? 到目前为止我还没有想出注入这个的方法,嗯...

当然可以在A 中使用一些std::unique_ptr 并制作一个模板递归包装器来生成new TensorMap,但这不是我想要的。

【问题讨论】:

  • NumberList operator() 常量表达式,还是在运行时求值?
  • 在运行时评估

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


【解决方案1】:

使用委托构造函数,和std::index_sequence:

struct A{
public:
    template<unsigned int N>
    A( NumberList<N> & idx ) : A(idx, std::make_index_sequence<N>{}) {}

private:
    template<unsigned int N, std::size_t... Is>
    A( NumberList<N> & idx, std::index_sequence<Is...>) : m(idx(Is)...) {}
public:
    TensorMap m;
};

【讨论】:

  • 啊,就是这样 =) 太棒了:-)
  • 应该是N+1 可能
  • 不知道它这么容易工作:-),这很漂亮:-)
  • 实际上,我想要 N = 元素数,但问题中并非如此,我将问题保持原样,尽管它可能有点奇怪
  • @Gabriel 在我看来,最好在网上留下更好的代码示例而不是其他方法。无论如何,N+1 案例并不有趣(也不是您问题的核心)。修复了答案和问题。
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 2021-08-23
  • 1970-01-01
  • 2011-09-05
  • 2016-09-02
  • 2011-08-08
  • 2018-10-22
  • 1970-01-01
相关资源
最近更新 更多