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++ 可变参数(包大小为N)和默认参数_C++_Templates_C++11_Metaprogramming_Template Meta Programming - Fatal编程技术网

C++ 可变参数(包大小为N)和默认参数

C++ 可变参数(包大小为N)和默认参数,c++,templates,c++11,metaprogramming,template-meta-programming,C++,Templates,C++11,Metaprogramming,Template Meta Programming,让N成为类型为std::size\u t的模板参数。我希望能够通过两种方式调用类的构造函数: A a(x1, x2, x3, ..., xN) 及 其中xi变量均为同一类型。我的第一个想法是: template <std::size_t N> struct A { template <typename ...Args, typename = typename std::enable_if<N == sizeof...(Args), void>::type

N
成为类型为
std::size\u t
的模板参数。我希望能够通过两种方式调用类的构造函数:

A a(x1, x2, x3, ..., xN)

其中
xi
变量均为同一类型。我的第一个想法是:

template <std::size_t N>
struct A
{
     template <typename ...Args, typename = typename std::enable_if<N == sizeof...(Args), void>::type>
     A(Args ...args) {
         f(args...); // where f is some function
     }

     template <typename ...Args, typename = typename std::enable_if<N+1 == sizeof...(Args), void>::type>
     A(Args ...args) {
         // run f on the first N arguments
         // run g on the last argument (selection is done using templates, I just did not want to write the code)
     }
};
模板
结构A
{
模板
A(Args…Args){
f(args…;//其中f是某个函数
}
模板
A(Args…Args){
//在前N个参数上运行f
//在最后一个参数上运行g(选择是使用模板完成的,我只是不想编写代码)
}
};
有关此技术的说明,请参见:。 当然,这样做的问题是您不能以这种方式重载构造函数


有什么想法吗?

只是换一种说法:

template <std::size_t N>
struct A
{
     template <typename ...Args, 
               typename std::enable_if<N == sizeof...(Args), int>::type = 0>
     A(Args ...args) {
     }

     template <typename ...Args, 
               typename std::enable_if<N+1 == sizeof...(Args), int>::type = 0>
     A(Args ...args) {
     }
};
模板
结构A
{
模板
A(Args…Args){
}
模板
A(Args…Args){
}
};

.

您能解释一下区别吗?@0x499602D2 OP中的一个重新定义了相同的函数模板(使用不同的默认参数)。如果签名的部分使
成为enable_,则这两个不同的函数模板就可以使用了。那么,前者是否应该用于SFINAE?一般来说,两者都可以。如果重载具有完全相同的签名,则不能使用第一个。
template <std::size_t N>
struct A
{
     template <typename ...Args, 
               typename std::enable_if<N == sizeof...(Args), int>::type = 0>
     A(Args ...args) {
     }

     template <typename ...Args, 
               typename std::enable_if<N+1 == sizeof...(Args), int>::type = 0>
     A(Args ...args) {
     }
};