成员函数模板bar
的以下特化是否有效?它编译在gcc 4.5.3和VS .NET 2008上。我很困惑,因为我模糊地回忆起读取功能模板不能专门化。
struct Foo
{
template<typename T>
void bar();
};
template<typename T>
void Foo::bar(){}
template<>
void Foo::bar<bool>(){}
int main()
{
Foo f;
f.bar<char>();
f.bar<bool>();
}
答案 0 :(得分:3)
功能模板不能部分专业化,但可以明确专业化,您的代码完全正确。
答案 1 :(得分:0)
函数模板部分特化was considered in C++11 but was rejected,因为函数模板重载可用于解决相同的问题。但是,在执行此操作时必须查找some caveats。
示例:
template <typename T> void foo(T);
void foo(int);
foo(10); // calls void bar(int)
foo(10.f); // calls void bar(T) [with T = float]
foo(10u); // calls void bar(T) [with T = unsigned int]!!
对于您的情况,此类事情可能有效
struct Foo
{
template<typename T>
void bar(T dummy);
void bar(bool dummy);
};
template<typename T>
void Foo::bar(T dummy) { }
void Foo::bar(bool dummy) { }
int main()
{
Foo f;
f.bar('a');
f.bar(true);
}