【问题标题】:Variadic Parameters to Comma Initializer List?逗号初始化列表的可变参数?
【发布时间】:2014-03-06 20:44:43
【问题描述】:

我希望有一个类,它有一个构造函数,它接受可变数量的参数并通过以某种方式解包到数组支持的逗号初始化器列表来填充数组,这里是示例:

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 &lt;&lt; 1,2,3;) 处理的 ArrayType。我想知道以下是否可行,如果我们可以使用索引运算符 (i) 到第 i 个元素,是否还有其他优雅的方式来填充数组:-)

非常感谢:)

【问题讨论】:

  • 如果你允许arr &lt;&lt; values1; arr &lt;&lt; values2;,那就很容易了。否则,如果不编写递归函数模板,我看不到捷径。
  • @JohannesSchaub-litb 以及递归函数 template 有什么问题?
  • @Yakk 感觉不紧凑

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


【解决方案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

【讨论】:

  • comma_collapse 的存在只是为了解决当我在comman_splice 的返回类型确定中递归使用它时,GCC 和 CLANG 都拒绝检查 comma_splice 本身的问题,并且只想使用较早的重载。我不知道他们是否正确。所以我手动解析comma_collapse中的类型。
  • 在函数模板中递归引用返回类型需要 ADL,因为返回类型是声明符的一部分,因此无法通过非限定查找找到(函数模板的)名称。跨度>
  • @dyp 嗯。因此,如果我将它放在带有玩具 struct detail::Foo 参数的 namespace detail 中,它会起作用吗?
  • 我想是的。几个月前我已经回答了一个与此问题有关的问题,我看看能不能找到它。
  • 嗯似乎this 是我想到的(一个)问题。但是,它不包括您的解决方法。
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多