可变数量的构造函数参数取决于整数模板

时间:2016-03-21 13:03:57

标签: c++ templates c++11

我正在编写一个包装私有std::array的容器存储类模板,以便为其添加一些功能。模板参数化值的数量,如下所示:

template<size_t N> class Vector {
private:
    array<double, N> vals;
public:
    [...]
};

我希望类的构造函数只接受N双精度来填充数组,但我找不到一个好方法来做到这一点。变量论证不提供一种机制来检查它们中有多少,所以它们是正确的。参数包不进行浮点提升,但如果我只能弄清楚如何使用它们,我愿意处理它。

我尝试在Member function template with the number of parameters depending on an integral template parameter的答案中使用该方法,但我无法理解enable_if<>::type=0部分的重要性。我试过天真地复制那些代码(虽然我更理解它是如何工作的。我看到人们在其他地方使用::value但是我找不到任何关于原因的文档)但是扩展了结果参数包似乎不起作用。我对参数包的另一个顾虑是,我不确定他们是否确保所有参数的类型都相同。

我尝试在构造函数的主体中运行初始化列表大小的static_assert,但当然列表的大小在编译时不是常量,所以这不起作用任

这里有标准方法吗?我只是使用参数包错了吗?

<小时/> 的更新 我在上面链接的答案中得到了部分工作方法:

template<size_t N> class Vector {
private:
    array<double, N> vals;
public:
    template <typename ...T,
          typename enable_if<sizeof...(T) == N, int>::type = 0>
    Vector(T ...args) {
        vals = {args...};
    }
};

现在的问题是模板中的enable_if字词意味着当我初始化Vector时,例如

Vector<3> V {1.0, 2.0, 3.0};

它请求模板专精Vector<3>::Vector<double, double, double, 0>而不是<double, double, double>。如何摆脱模板中的这个流浪词?

3 个答案:

答案 0 :(得分:5)

不要理解你的意思:

  

变量参数不提供检查有多少的机制   他们有,所以他们出去了

template <typename ...T>
Vector(T... args) {
    static_assert(sizeof...(args) <= N, "oops");
}

应该工作..

答案 1 :(得分:2)

您还可以通过一些模板专业化技巧生成一个合适大小的包:

template <size_t N, class = std::make_index_sequence<N>>
class Vector;

template <size_t N, size_t... Is>
class Vector<N, std::index_sequence<Is...>> 
{
private:
    std::array<double, N> vals;

    template <size_t >
    using double_ = double;
public:
    Vector(double_<Is>... vals)
    {
        ...
    }
};

这是一个非模板构造函数,需要N double s。

答案 2 :(得分:2)

通过关注Member function template with the number of parameters depending on an integral template parameterVariadic templates with exactly n parameters,我们可以使用以下代码。

template<size_t N> class Vector {
private:
    array<double, N> vals;
public:
    template <typename ...T,
          typename enable_if<sizeof...(T) == N, int>::type = 0>
    Vector(T ...args) : vals{args} {}
};