逗号初始化列表的变量参数?

时间:2014-03-06 20:44:43

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

我想有一个具有构造函数的类,它通过以某种方式解压缩数组支持的逗号初始化列表来获取可变数量的争论并使用它填充数组,这里是示例:

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;

}

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

非常感谢:)

1 个答案:

答案 0 :(得分: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)... );
}

如果你想要一个零参数版本,创建一个单独的重载(因为在一次传递中这样做是不切实际的。)

live example