我想到的应用程序类似于一个Vector<size>
类,我希望在其中声明
CrossProduct(const Vector<size>& other)
仅适用于大小为 3 的情况。我知道有办法绕过它...
- 仅包含 size=3 的函数定义
- 让所有其他尺寸产生链接器错误
- 在方法的开头做一个静态断言来检查大小是否为 3
有没有办法正确地只为特定实例声明成员函数?
这是一种方法:
template <class Type, size_t Size>
struct EnableCrossProduct
{
};
template <class Type>
struct EnableCrossProduct<Type, 3>
{
void CrossProduct(const Type & other){}
};
template <size_t Size>
struct Vector : public EnableCrossProduct<Vector<Size>, Size>
{
};
如果您可以在编译时获取大小信息,则可以使用 std::enable_if。
template<int N>
struct Vector
{
static const int size = N;
double data[N];
// ...
template<class V>
double CrossProduct( const V& other,
typename std::enable_if< size == 3 && V::size == 3 >::type* = 0) const
{
// ...
return 0;
}
};
void foo( const Vector<3>& v3, const Vector<4>& v4 )
{
v3.CrossProduct( v3 ); // Ok
v3.CrossProduct( v4 ); // Compile-time error
}
您可能只想在 enable_if 中设置该条件size == V::size
。
我更喜欢这种static_assert
方法。这