单模板参数的专业化

时间:2014-08-30 17:35:48

标签: c++ templates specialization

请考虑以下代码:

/* aclass.h */
class AClass
{
public:
    template<size_t N, class Vector>
        void aMethod(const Vector &);
};

/* aclass.inl */
// method for any N
template<size_t N, class Vector>
    void AClass::aMethod(const Vector &) { ... }

// method for N = 1
template<class Vector>
    void AClass::aMethod<1>(const Vector &) { ... }

/* main.cpp */
int main()
{
    AClass inst;
    std::vector<float> data;
    // calls method for any N
    inst.aMethod<20>(data);
    // calls method for N = 1
    inst.aMethod<1>(data);
}

我似乎无法找到专门用于整数类型的单个模板参数的正确语法 - 甚至不确定它是否合法。我环顾四周,但没有发现任何人有这个问题...

这些是我得到的错误(来自msvc):

error C2244 : 'AClass::aMethod' : unable to match function definition to an existing declaration
error C2768 : 'AClass::aMethod' : illegal use of explicit template arguments

我将如何继续解决这个问题?

1 个答案:

答案 0 :(得分:1)

不存在功能模板的部分特化。

为了实现你的目标,你可以通过一个辅助类,它可以是部分专业的:

class AClass;

template<size_t N, class Vector>
struct AMethodHelper {
  static void Do(AClass* pThis, const Vector&) {
    // General for N != 1
  }
};

template<class Vector>
struct AMethodHelper<1, Vector> {
  static void Do(AClass* pThis, const Vector&) {
    // Special for N == 1
  }
};

class AClass
{
public:
    template<size_t N, class Vector>
    void aMethod(const Vector & v) {
      AMethodHelper<N, Vector>::Do(this, v);
    }
};

或者,您可以使用SFINAE选择的两个重载:

class AClass
{
public:
    template<size_t N, class Vector>
    typename enable_if<N!=1>::type aMethod(const Vector &) {
          // General for N != 1
    }
    template<size_t N, class Vector>
    typename enable_if<N==1>::type aMethod(const Vector &) {
        // Special for N == 1
    }
};

或者,我想,你可以在里面放一个if (N == 1)的方法。我怀疑任何体面的编译器都足够聪明,可以在任何给定的实例化中消除死代码。