模板类中非模板方法的模板特化

时间:2014-10-13 15:20:47

标签: c++ template-specialization

可以使用模板专业化来实现这样的东西:

template <typename T>
T bar(T baz);

template <>
static unsigned int bar<unsigned int>(unsigned int baz)
{
    return baz + 1;
}

template <>
static int bar<int>(int baz)
{
    return baz + 2;
}

但是如果模板参数在包含该方法的类上呢?

template <typename T>
class Foo
{
    T fooBar(T baz);
};

我怎样才能(如果有的话)使用模板专精来实现fooBar方法的不同形式,就像我上面那样?

由于

1 个答案:

答案 0 :(得分:7)

同样的基本方法,你只需要明确模板的位置。

这是错误的,因为虽然该方法隐式地是一个模板(因为该类是),但它继承了&#34;类中的模板类型:

template <>
inline unsigned int Foo::fooBar<unsigned int>(unsigned int baz)

相反,请在类之后指定类型:

template <>
inline unsigned int Foo<unsigned int>::fooBar(unsigned int baz)
{
    return baz + 1;
}

template <>
inline int Foo<int>::fooBar(int baz)
{
    return baz + 2;
}

Demo

请注意,此处需要inline,因为它们不是模板函数,而是专门化。因此,他们必须遵循一个定义规则。与任何其他非模板函数/方法定义一样,inline抑制ODR。

或者,您可以在标头中声明它们并在实现文件中实现它们:

// Header file
template <>
unsigned int Foo<unsigned int>::fooBar(unsigned int baz);

template <>
int Foo<int>::fooBar(int baz);

// Implementation file
template <>
unsigned int Foo<unsigned int>::fooBar(unsigned int baz)
{
    return baz + 1;
}

template <>
int Foo<int>::fooBar(int baz)
{
    return baz + 2;
}

相同的基本语法适用于模板类型中的模板方法,除了您需要两个template <>,因为您专门设计了两个不同级别的模板:

template <typename T>
class Foo
{
public:
    template <typename U>
    void foobar(T t, U u);
};

// Specialization of T=int, U=unsigned int
template <>
template <>
inline void Foo<int>::foobar<unsigned int>(int t, unsigned int u)
{
    // ...
}