专门用于非模板类的成员函数模板

时间:2014-01-13 11:58:20

标签: c++ templates template-specialization overloading function-templates

成员函数模板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>();
}

2 个答案:

答案 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);
}