可变参数模板-限制参数的数量

C++ variadic template - limit number of args

本文关键字:参数 变参      更新时间:2023-10-16

我有一个带有set函数的可变模板类,它填充内部数组:

template <size_t Dim>
class Vector
{
public:
    void SetValueTemplate(size_t index)
    {
        return;
    }
    template <typename X0, typename ...Xn>
    void SetValueTemplate(size_t index, X0 x0, Xn... xn)
    {
        val[index] = x0;
        SetCenterValueTemplate(index + 1, xn...);
    }
    template <typename ...X0>
    void SetValue(X0... t0)
    {
        SetValueTemplate(0, t0...);
    }
private:
    double val[Dim];
};

问题是,我可以把它叫做

Vector<3> v;
v.SetValue(0, 1, 2, 4, 5);

并正确编译。我可以将其限制为不编译吗?我可以用static_assert,但是没有它可以吗?

是的,这是可能的,没有static_assert。例如,假设我们希望我们的vector类只能以参数的名称数作为向量的维数进行赋值,您可以使用:

template<std::size_t Dim>
struct vector {
    template <typename X0, typename ...Xn>
    typename std::enable_if<sizeof...(Xn) + 1 == Dim, void>::type
    assign(X0 x0, Xn... xn) {}
};

这只是使用std::enable_ifsizeof...组合来启用或禁用特定的赋值功能。

所以下面的代码可以编译:

vector<3> x;
x.assign(1, 2, 3);

现场演示

但这不会:

vector<3> x;
x.assign(1, 2, 3, 4);

现场演示

with (for Clang):

main.cpp:14:7: error: no matching member function for call to 'assign'
    x.assign(1, 2, 3, 4);
    ~~^~~~~~

vector<3> x;
x.assign(1, 2);

现场演示