Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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_Variadic Templates_Variadic Functions - Fatal编程技术网

C++ 限制可变模板参数包中的参数数量

C++ 限制可变模板参数包中的参数数量,c++,templates,c++11,variadic-templates,variadic-functions,C++,Templates,C++11,Variadic Templates,Variadic Functions,我有一个模板函数,它接受可变数量的参数。由于您不能强制参数为某种类型,我希望至少强制参数的数量不要高于编译时确定的数量(例如10) 如果带有参数包的模板函数的参数数高于编译时确定的值,是否可能使编译器给出错误 template <class ...Args> void setRequestArguments(const Args&... args) { const std::vector<QGenericArgument> vec = { args...

我有一个模板函数,它接受可变数量的参数。由于您不能强制参数为某种类型,我希望至少强制参数的数量不要高于编译时确定的数量(例如10)

如果带有参数包的模板函数的参数数高于编译时确定的值,是否可能使编译器给出错误

template <class ...Args>
void setRequestArguments(const Args&... args)
{
    const std::vector<QGenericArgument> vec = { args... };
    qDebug() << sizeof...(args);
    // Do stuff...
    // for (unsigned i = 0; i < vec.size(); ++i) {
    //     qDebug() << vec[i].name();
    // }
}
模板
void setRequestArguments(常量参数和…参数)
{
const std::vector vec={args…};
qDebug()
如果带有参数包的模板函数的参数数高于编译时确定的值,是否可能使编译器给出错误

是的,使用:

模板
void setRequestArguments(常量参数和…参数)
{

static_assert(sizeof…(args)要使函数在参数过多时不可调用,可以使用sfinae约束函数。这样,如果有另一个重载接受更多参数,编译器将能够选择正确的重载

一个简单的
std::enable_if
条件就足够了:

template <class ...Args, std::enable_if_t<(sizeof...(Args) <= 10)>* = nullptr>
void setRequestArguments(const Args&... args)
{
    const std::vector<QGenericArgument> vec = {args... };
}

使用SFINAE确实是一种有趣的方式:)可以将参数限制为某一类型。你想得到这个问题的答案吗?你需要参数完全是
T
还是可以转换为
T
?@bolov是的,那将非常有用!我会+1我创建了一个新帖子,内容完全是:@bolov很棒的帖子,谢谢!
template <class ...Args, std::enable_if_t<(sizeof...(Args) <= 10)>* = nullptr>
void setRequestArguments(const Args&... args)
{
    const std::vector<QGenericArgument> vec = {args... };
}
template <class ...Args>
auto setRequestArguments(const Args&... args) -> std::enable_if_t<(sizeof...(args) <= 10)>
{
    const std::vector<QGenericArgument> vec = {args... };
}
auto setRequestArguments(const auto&... args) requires (sizeof...(args) <= 10) -> void {
    const std::vector<QGenericArgument> vec = {args... };
}