c++ - 对模板方法的特定特化使用不同签名的正确方法

标签 c++ templates

假设您有以下模板方法:

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

现在,我想为除 T 之外的特定类实现 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”),但我不喜欢这个解决方案,因为模板方法“知道”其他实现。

有没有更好的更正确的方法来做到这一点?

最佳答案

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

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

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

请注意,此特化不再是模板函数,而是常规成员函数,只是名称很花哨。因此,它应该在 header 中声明并在源文件中定义,或者在 header 中使用 inline 关键字定义(我的示例显示的是后者)。

关于c++ - 对模板方法的特定特化使用不同签名的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27767784/

相关文章:

c++ - 从其他模块调用基类构造函数

c++ - 当在创建子项后设置父项时,子项对事件是透明的

c++ - 将 unique_ptr 的 vector 传递给对象。 vector 成为成员变量。正确的做法?

c++ - 从 QVariant 接收未知的模板化对象

c++ - 在 C++ 的模板函数中使用正确的字符串文字

C++ - 我需要哪些库或命令行程序来创建一个获取 AVI 文件并将其刻录到 DVD 的程序?

c++ - 通过 Internet 发送 boolean 值(Windows 和 Linux)

c++ - 以自定义类作为键的 std::map 始终返回 1 的大小

python - 如何将值传递给 Tornado 中的模板

c++ - 为什么我不能使用作为模板类的父类的变量?