C++ 可变参数模板 - 限制参数的数量
C++ variadic template - limit number of args
我有一个带有 set 函数的可变参数模板 class,它填充内部数组:
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
class 只能以参数的名称数量作为向量的维度来分配,您可以使用:
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_if
结合 sizeof...
来启用或禁用特定的分配功能。
所以下面将编译:
vector<3> x;
x.assign(1, 2, 3);
但这不会:
vector<3> x;
x.assign(1, 2, 3, 4);
with(对于 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);
有类似的错误信息。
我有一个带有 set 函数的可变参数模板 class,它填充内部数组:
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
class 只能以参数的名称数量作为向量的维度来分配,您可以使用:
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_if
结合 sizeof...
来启用或禁用特定的分配功能。
所以下面将编译:
vector<3> x;
x.assign(1, 2, 3);
但这不会:
vector<3> x;
x.assign(1, 2, 3, 4);
with(对于 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);
有类似的错误信息。