Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数参数的可变数量取决于整型模板_C++_Templates_C++11 - Fatal编程技术网

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

C++ 构造函数参数的可变数量取决于整型模板,c++,templates,c++11,C++,Templates,C++11,我正在编写一个容器存储类模板,它包装了一个私有的std::array,以便为它添加一些功能。模板参数化值的数量,如下所示: template<size_t N> class Vector { private: array<double, N> vals; public: [...] }; 现在的问题是,模板中的enable_if术语意味着当我初始化向量时,例如 Vector<3> V {1.0, 2.0, 3.0}; 向量V{1.0,2.0

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

template<size_t N> class Vector {
private:
    array<double, N> vals;
public:
    [...]
};
现在的问题是,模板中的
enable_if
术语意味着当我初始化
向量时,例如

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

它要求模板专业化
Vector::Vector
,而不是
。我如何在模板中去掉这个术语?

不明白你的意思:

可变参数不提供一种机制来检查 他们在那里,所以他们马上就出来了

模板
向量(T…args){

static_assert(sizeof…(args)您还可以通过一些模板专门化技巧生成适当大小的包:

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)
    {
        ...
    }
};
模板
类向量;
模板
类向量
{
私人:
std::数组vals;
模板
使用double=double;
公众:
向量(双值)
{
...
}
};
这是一个非模板构造器,它通过以下方式获得双精度
,并使其与以下代码一起工作

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} {}
};
模板类向量{
私人:
数组VAL;
公众:
模板
向量(T…args):vals{args}{}
};

为什么不为构造函数设置一个
数组
参数?然后使用
向量{{1,2,3}
。为什么要去掉这个散乱项?将
向量(T…args){vals={args…};}
更改为
向量(T…args):val{args…}{
@Holt我的错误,我误读了一个不相关的警告对其来源的引用,作为模板中的第四个术语,抛出了一个错误。现在一切似乎都好了。@PiotrSkotnicki忘记了这一点!已经修复了,谢谢。我不知道这会产生
“args”不是指参数包的名称。
扩展同样适用于老式的可变参数和参数包。除此之外,静态断言是否正确地阻止了过载被选择,或者如果断言失败,它们是否会被卡住?@TroyHurts
static\u断言
不会阻止过载被选择,因为您应该使用
std::enable_if
正如你链接的帖子中所解释的那样。为什么你要将参数的数量限制在
N-1
?@Holt已经进一步尝试让
enable_if
工作。如上所述。你可以通过添加另一个参数,比如
typename=decltype(std::array{{{std::declval()…}),使它更为sfinaebla
很好的答案-我要指出1)这是(在这个线程中)唯一允许构造函数参数的括号初始化的答案(例如
向量向量{{{1,2},{2,3};
),和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)
    {
        ...
    }
};
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} {}
};