对模板方法的特定专业化使用不同签名的正确方法

Correct way to use different signature to specific specialization of template method

假设您有以下模板方法:

class A
{
    template<typename T>
    void f(const T& t)
    {
       // do something with t.
    }
};

现在,除了 T:

之外,我想要针对特定​​ class 的 f() 的不同实现
class A
{
    template<typename T>
    void f(const T& t)
    {
       // do something with t.
    }

    void f(const std::string& t)
    {
       // do something ELSE with t if T is std::string.
    }
};

我知道我可以在模板方法上使用 std::enable_if<>(准确地说是 "disable_if"),但我不喜欢该解决方案,因为模板方法 "knows" 关于其他实现。

有没有更好的更正确的方法?

你展示的是超载,而不是专业化。它应该像写的那样工作:你有什么问题?

无论如何,专业化应该是这样的:

// Outside of the class definition:
template <>
inline void A::f<std::string>(const std::string& t) { ... }

注意这个特化不再是一个模板函数,而是一个普通的成员函数,只是有一个花哨的名字。所以它应该在头文件中声明并在源文件中定义,或者在头文件中使用 inline 关键字定义(我的示例显示后者)。