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

标签 c++ templates c++11 variadic-templates variadic-functions

我有一个模板函数,它接受可变数量的参数。由于您不能强制参数为某种类型,因此我至少希望强制参数的数量不要高于编译时确定的数量(例如 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/

相关文章:

c++ - C 和/或 C++ 预处理器的标准?

c++ - 使用隐含长度初始化 std::array

c++ - 保留不可构造对象的 vector

c++ - 即使已安装 Azure 管道也不使用指定的编译器

c++ - C++ 中的 Android 用户界面

c++ - 如何让 boost::make_shared 成为我类(class)的 friend

ios - xcode根据文件模板从物理文件夹创建组

c++ - 别名(或类型定义)参数化类的内部类

c++ - 检查是否存在全局(/命名空间)函数/对象声明

c++ - 将 const_cast 元素移出 std::initializer_list 是否有风险?