C 模板功能是否有任何方法可以采用n个参数

Is there any way for a C++ template function to take exactly N arguments?

本文关键字:参数 方法 功能 是否 任何      更新时间:2023-10-16

我的意思是,例如,类似类的构造函数:

class vector<size_t N, typename FLOAT=double> {
    vector(FLOAT ...x) {} // I want exactly N arguments here
};

我希望我很明显,我做不是想要一个变异函数,而是一个函数,当n在compile time中知道n时,恰好 n参数。因此,使用上面的示例,vector<3>(1.5, 2.5)应产生编译时错误,而vector<2>(1.5, 2.5)应编译并运行。

这是可能的吗?

我认为也许可以使用参数包来完成,但是我不太确定如何。

在某种程度上,您可以做类似的事情:

template <std::size_t, typename T> using alwaysT = T;
template <typename FLOAT, typename Seq> struct vector_impl;
template <typename FLOAT, std::size_t... Is>
struct vector_impl<FLOAT, std::index_sequence<Is...>> {
     vector_impl(alwaysT<Is, FLOAT>... floats) { /*...*/}
};
template <std::size_t N, typename FLOAT>
using vector = vector_impl<FLOAT, std::make_index_sequence<N>>;

最简单的方法可能只是使用 static_assert。适当地添加图案匹配:

template<int N, typename... Args>
void foo(Args... args) {
    static_assert(sizeof...(args) == N, "Incorrect number of arguments");
    // stuff
}

这大部分时间都会做,甚至允许您遇到一个友好的自定义错误。

您甚至可以发疯,并使用foldexprs对参数应用更多约束:

static_assert(((std::is_integral_v<Args>) && ...), "All arguments must be integers");

与基于Sfinae的解决方案相比,这种方法的价值是您可以获得更少的疯狂编译错误。

如果使用C 20,则可以使用新的requires关键字以更强大/友好的方式应用相同的概念。