可以使用模板专业化来实现这样的东西:
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方法的不同形式,就像我上面那样?
由于
答案 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)
{
// ...
}