C++ 将方法的签名作为模板参数传递给类

C++ 将方法的签名作为模板参数传递给类,c++,templates,C++,Templates,我想为我的项目中的数据处理类创建一个模板接口 我可以这样写: template <class T> class DataHandler { public: void Process(const& T) = 0; }; 模板 类数据处理程序 { 公众: 无效过程(const&T)=0; }; 然后,假设我这样定义一个类: class MyClass: public DataHandler<int> { void Process(

我想为我的项目中的数据处理类创建一个模板接口

我可以这样写:

template <class T>
class DataHandler
{
    public:
        void Process(const& T) = 0;
};
模板
类数据处理程序
{
公众:
无效过程(const&T)=0;
};
然后,假设我这样定义一个类:

class MyClass: public DataHandler<int> 
{
    void Process(const int&) { /* Bla-bla */ }
}
class MyClass: public DataHandler<void (int&)> 
{
    void Process(const int&) { /* Bla-bla */ }
}
class MyClass:公共数据处理程序
{
无效进程(常量int&){/*Bla*/}
}
现在,问题来了,我能否以某种方式定义模板接口,使它不仅接收类型T,而且接收Process()函数的整个签名作为参数

我想要这样的东西:

class MyClass: public DataHandler<int> 
{
    void Process(const int&) { /* Bla-bla */ }
}
class MyClass: public DataHandler<void (int&)> 
{
    void Process(const int&) { /* Bla-bla */ }
}
class MyClass:公共数据处理程序
{
无效进程(常量int&){/*Bla*/}
}

可能吗?例如,我知道boost::signal以这种方式接收模板参数,但是,如果我理解正确的话,它们使用了很多黑魔法

是的,你可以。但是在C++03中,您必须为每一个参数执行复制/粘贴代码(这还不错,因为在这里您不需要常量/非常量等的重载。常量已经知道了!)

模板
结构参数;
模板
结构参数{
类型def R ret_类型;
类型定义P1 parm1_类型;
};
模板
类数据处理程序
{
typedef typename parm::ret_type ret_type;
typedef typename parm::parm1_type parm1_type;
公众:
虚拟ret_型过程(parm1_型t)=0;
};
类MyClass:公共数据处理程序
{
无效进程(常量int&){/*Bla*/}
};

在C++0x中,您将能够编写

template <class T>
class DataHandler;

template<typename R, typename ... P>
class DataHandler<R(P...)> 
{
    public:
        virtual R Process(P... t) = 0;
};

class MyClass: public DataHandler<void (const int&)> 
{
    void Process(const int&) { /* Bla-bla */ }
};
模板
类DataHandler;
模板
类数据处理程序
{
公众:
虚R过程(P…t)=0;
};
类MyClass:公共数据处理程序
{
无效进程(常量int&){/*Bla*/}
};

多好啊

现在的问题仍然是:我们需要多少年才能在日常工作中使用可变模板。知道它有多简单可能会带来伤害…我应该如何更改它以支持DataProducer接口中Process()函数中的多个参数?我是说,我想支持这样的东西DataHandler@Lev,我怀疑您必须在函数类型上部分地专门化
DataHandler
,这样才能正确地获得
过程
函数声明
boost::function
使用预处理器生成所需的代码,但对于自己的项目和一些用途,在我看来,将自己介绍给以后可能不再需要的主题几乎没有什么用处。所以只要复制/粘贴4次就可以了:)Johannes,你能解释一下你在回答的第一行中所做的struct parm预声明的含义吗?@Lev,它没有定义。因此,如果我们做了
parm::parm1_type
,我们会得到一个错误,我们应该定义
parm
。我可以添加大括号,比如
{}
来定义模板,然后它会说没有类型“parm1_type”。未定义的代码向代码的读者发出信号,表示我们不打算对这种情况有任何意义。