2

我想有一个类,它有一个构造函数,它接受可变数量的争论,并通过以某种方式解包到数组支持的逗号初始值设定项列表来填充数组,这里是示例:

class A{
    public:
    template<typename ...T>
    A(T ... values): arr(sizeof...(T)) {
         //convert the values somehow that the parameter pack is expanded in the comma initialized list as the following:

         //arr << values1, values2, values3,... , valuesN
    }

    ArrayType arr;

}

这种逗号初始化方法尤其适用于 ArrayType 与 Eigen::Matrix 类 ( arr << 1,2,3;) 之间的关系。我想知道以下是否可行,如果有其他优雅的方式来填充数组,我们可以使用索引运算符 (i) 到第 i 个元素:-)

非常感谢 :)

4

1 回答 1

1
#include <utility>

template<typename T0, typename... Ts>
struct comma_collapse { typedef T0 type; };
template<typename T0, typename T1, typename... Ts>
struct comma_collapse<T0, T1, Ts...> {
    typedef decltype( std::declval<T0>(), std::declval<typename comma_collapse<T1, Ts...>::type>() ) type;
};

template<typename LHS>
LHS&& comma_splice(LHS&& lhs){ return std::forward<LHS>(lhs); }

template<typename LHS, typename RHS, typename... Tail>
typename comma_collapse<LHS,RHS,Tail...>::type&& comma_splice( LHS&& lhs, RHS&& rhs, Tail&&... tail )
{
  auto&& first_two = (std::forward<LHS>(lhs),std::forward<RHS>(rhs));
  return comma_splice(
    std::forward<decltype(first_two)>(first_two),
    std::forward<Tail>(tail)...
  );
}

然后像这样实现构造函数:

template<typename T0, typename... Ts>
A(T0&& t0, Ts&& ... ts): arr(sizeof...(Ts)) {
  comma_splice( (arr << std::forward<T0>(t0)), std::forward<Ts>(ts)... );
}

如果您想要一个零参数版本,请创建一个单独的重载(因为一次性完成它是不切实际的)。

活生生的例子

于 2014-03-06T21:22:31.240 回答