7

我想到的应用程序类似于一个Vector<size>类,我希望在其中声明

CrossProduct(const Vector<size>& other)

仅适用于大小为 3 的情况。我知道有办法绕过它...

  • 仅包含 size=3 的函数定义
  • 让所有其他尺寸产生链接器错误
  • 在方法的开头做一个静态断言来检查大小是否为 3

有没有办法正确地只为特定实例声明成员函数?

4

3 回答 3

5

这是一种方法:

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>
{
};
于 2013-03-20T19:57:07.613 回答
3

如果您可以在编译时获取大小信息,则可以使用 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

于 2013-03-20T19:54:37.007 回答
2

我更喜欢这种static_assert方法。这

  • 导致最清晰的错误信息
  • 是合适的,因为不需要 SFINAE
  • 是最简单的方法。
于 2013-03-20T19:55:56.007 回答