C++ 限制可变模板参数包中的参数数量
我有一个模板函数,它接受可变数量的参数。由于您不能强制参数为某种类型,我希望至少强制参数的数量不要高于编译时确定的数量(例如10) 如果带有参数包的模板函数的参数数高于编译时确定的值,是否可能使编译器给出错误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...
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... };
}