我有一个基类 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/