c++ - 具有由整数确定的固定数量参数的函数

标签 c++ function c++11 c++14 c++17

我有一个带有接受整数的模板的类:

template <unsigned int N>
class Example {};

我正在寻找一种方法来定义一个(成员)函数,该函数接受一定数量的 Example 对象作为参数。金额由N决定,所以函数会这样使用:

Function(Example<2>(), Example<2>());
Function(Example<3>(), Example<3>(), Example<3>());

到目前为止我尝试了什么:

使用初始化列表,可以将一组对象传递给函数:

template <unsigned int N>
void Function(std::initializer_list<Example<N>> list);
//...
Function({Example<2>(), Example<2>()});

但是,除了实际上只传递了一个参数(列表)这一事实之外,问题在于使用此方法可以使用任意数量的参数:

Function({Example<2>()});

我也尝试过使用可变参数函数:

template <unsigned int N>
void Function(Example<N> e...)
{
    va_list args;
    va_start(args, e);
    //...
}
Function(Example<2>(), Example<2>());

这使得使用真实参数成为可能,但是使用任意数量的参数的问题仍然存在,并且无法知道实际传递了多少参数。

最佳答案

假设您希望从 Example<N> 中推断出参数的数量。类型,然后全部 Example<I>应该共享相同的 N ,一个 C++17 解决方案可能是

template <unsigned int... I>
auto Function( Example<I>... ) ->
    std::enable_if_t<( ( I == sizeof...(I) ) && ... )>
{
   // or static_assert() if you always want an error
}

关于c++ - 具有由整数确定的固定数量参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47866607/

相关文章:

c++ - 中介者模式 vs 发布/订阅

c++ - 虚拟析构函数 - 谁调用底层的 free()?

r - 如何省略 do.call 产生的大量代码?

c++ - std::call_once vs std::mutex 用于线程安全初始化

c++ - 为什么不能在 c++0x 模式下使用 libc++ 连接这个 boost::program_options 示例?

c++ - 如何通过具有 1024 字节缓冲区的套接字连接发送 6 个字符的 c 字符串,并强制刷新

c++ - 为什么切片非根基类会产生正确答案?

Python:字符串操作在函数内部不起作用

RememberMe 的 onSubmit 登录表单中的 JavaScript 超时函数

c++ - 需要在 Codeblocks 中启用 C++11