我想在我的项目中为数据处理类创建一个模板接口。
我可以这样写:
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以这种方式接收模板参数,但是,如果我理解正确的话,他们会在那里使用大量的黑魔法。
答案 0 :(得分:12)
template<typename FnType>
struct parm;
template<typename R, typename P1>
struct parm<R(P1)> {
typedef R ret_type;
typedef P1 parm1_type;
};
template <class T>
class DataHandler
{
typedef typename parm<T>::ret_type ret_type;
typedef typename parm<T>::parm1_type parm1_type;
public:
virtual ret_type Process(parm1_type t) = 0;
};
class MyClass: public DataHandler<void (const int&)>
{
void Process(const int&) { /* Bla-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 */ }
};
多好多了!