我希望为我的项目中的数据处理类创建一个模板接口。
我可以编写如下代码:
假设我这样定义一个类:
现在,问题来了,我能否以某种方式定义模板接口,使其作为参数不仅接收类型T,还接收Process()函数的整个签名。
我希望实现以下功能:
我可以编写如下代码:
template <class T>
class DataHandler
{
public:
void Process(const& T) = 0;
};
假设我这样定义一个类:
class MyClass: public DataHandler<int>
{
void Process(const int&) { /* Bla-bla */ }
}
现在,问题来了,我能否以某种方式定义模板接口,使其作为参数不仅接收类型T,还接收Process()函数的整个签名。
我希望实现以下功能:
class MyClass: public DataHandler<void (int&)>
{
void Process(const int&) { /* Bla-bla */ }
}
这是可能的吗?我知道例如boost::signal就是以这种方式接收模板参数的,但如果我理解正确,他们在那里使用了很多黑魔法。
DataHandler
,以便你也能正确地得到Process
函数的声明。boost::function
使用预处理器生成所需的代码,但对于自己的项目和一些用途,引入这个主题几乎没有用处(在我看来),因为你可能之后不再需要它。所以只需复制/粘贴4次即可完成 :) - Johannes Schaub - litbparm<int>::parm1_type
,就会出现关于应该定义parm<int>
的错误。我本可以添加大括号来定义模板,然后它会说"parm1_type"类型不存在。不定义它告诉代码读者我们没有打算为那种情况提供任何意义。 - Johannes Schaub - litb