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) {
}
};