C++ C++;:&引用;“专业化”;用于从某个基类派生类的成员函数模板

C++ C++;:&引用;“专业化”;用于从某个基类派生类的成员函数模板,c++,templates,overload-resolution,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) { ... } }; 但这只在我对MessageBase对象调用ProcessDerived::f时起作

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

struct Process {
  void f(int a);
  void f(const char* b);
  template<typename T> void f(const T &t) { ... }
};
但这只在我对
MessageBase
对象调用
ProcessDerived::f
时起作用。如果在
MessageDerived
对象上调用它,则会选择模板方法


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

您需要在此处使用SFINAE。下面是一个示例(请注意,它需要c++11才能工作):

struct ProcessDerived:公共进程
{
模板无效f(常量T&T,类型名称std::conditional::type=0)
{
///做一些具体的事情
}
模板空白f(常数T&T,…)
{
返回过程:f(t);
}
};
})


您可以在

ProcessDerived::f中阅读有关它的更多信息,它隐藏了Process::f的所有定义(请参见此处:)。因此,使用MessageDerived对象调用ProcessDerived::f将调用ProcessDerived::f(const MessageBase&),因为这是唯一可见的f,但例如

ProcessDerived pd; 
pd(42);
不会编译。您需要添加一个

using Process::f;
在ProcessDerived中,您描述的问题出现了。然而,Alex Telishev在我写作时提出的解决方案同时解决了这两个问题

ProcessDerived pd; 
pd(42);
using Process::f;