C ++模板函数有没有办法正好采用N个参数?

时间:2018-02-16 00:31:16

标签: c++ templates

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

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

我希望很清楚我想要一个可变参数函数,但是当一个N在编译中已知时,该函数需要完全 N个参数时间。因此,使用上面的示例,vector<3>(1.5, 2.5)应该产生编译时错误,而vector<2>(1.5, 2.5)应该编译并运行。

这可能吗?

我在想,也许这可以用参数包完成,但我不太清楚如何。

2 个答案:

答案 0 :(得分:9)

通过一些间接,您可以执行以下操作:

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>>;

答案 1 :(得分:1)

可能最简单的方法就是使用static_assert。根据需要添加模式匹配:

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

这将在大多数情况下完成,甚至允许您有一个友好的自定义错误。