C++: "specializing"一个成员函数模板,用于从某个基类派生的类

标签 c++ templates overload-resolution

我有一个基类 MessageBase,我从中派生出各种其他消息类,例如 MessageDerived。我有另一个类对各种类型的数据进行一些处理,包括一个 catchall 方法模板:

struct Process {
  void f(int a);
  void f(const char* b);
  template<typename T> void f(const T &t) { ... }
};

因此,如果我在消息对象上调用 Process::f,就会调用模板方法。

现在我想为我的消息类添加自定义功能。我不允许更改 Process,所以我想从它派生(但即使我可以更改它,我也找不到获得自定义功能的方法)。我试过:

struct ProcessDerived : public Process {
  void f(const MesaageBase& m) { ... }  // Custom functionality for messages.
};

但这仅在我在 MessageBase 对象上调用 ProcessDerived::f 时有效。如果我在 MessageDerived 对象上调用它,则会选择模板方法。

有没有办法在让模板捕获所有其他类型的同时在所有消息类上选择自定义函数?

最佳答案

这里需要用到SFINAE。这是一个例子(注意它需要 c++11 才能工作):

struct ProcessDerived : public Process
{
  template<typename T> void f(const T &t, typename std::conditional<std::is_base_of<MessageBase, T>::value, int, void>::type = 0)
  {
    /// do something specific
  }

  template<typename T> void f(const T &t, ...)
  {
    return Process::f (t);
  }
};

};

您可以在 http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error 阅读更多相关信息

关于C++: "specializing"一个成员函数模板,用于从某个基类派生的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21509542/

相关文章:

c++ - 重载 operator<< 用于 ostream 语法

c++ - 范围解析运算符和从属名称

C++ 运算符重载参数与普通参数

c# - 当您只想更改返回类型时重载方法的最佳方法

c++ - 如何在重载的提取运算符中读取行(忽略空格字符)

c++ - 如何在 C++ 中处理时间

templates - 模板中引用的字符串

C++ 多类型模板使用指南

c++ - 为什么 C++ 编译器选择错误的函数(模板)

c++ - 当 2D bitset 存储为 1D 时 XOR bitset