我有一个模板函数,它接受可变数量的参数。由于您不能强制参数为某种类型,因此我至少希望强制参数的数量不要高于编译时确定的数量(例如 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();
// }
}
我想用它作为一个通用容器,用于 QMetaObject::invokeMethod
包装函数中的所有参数。
最佳答案
为了使函数在参数过多时不可调用,可以使用 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... };
}
为了可读性,您可以将约束放在函数的尾随返回类型中:
template <class ...Args>
auto setRequestArguments(const Args&... args) -> std::enable_if_t<(sizeof...(args) <= 10)>
{
const std::vector<QGenericArgument> vec = {args... };
}
这里是 C++20 的更新版本,使用 requires
和简洁的模板语法:
auto setRequestArguments(const auto&... args) requires (sizeof...(args) <= 10) -> void {
const std::vector<QGenericArgument> vec = {args... };
}
关于c++ - 限制可变参数模板参数包中的参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39621158/