如何从C模板中的方法类型推导出类类型?

在如下所示的模板中,我希望调用Run(& Base :: foo)成功,而无需将Base类型命名两次(如编译Run< Base>(& Base :: foo)调用中所做的那样) ).我可以吗?可能没有添加大量的Boost标题?

使用提供的代码,我得到一个错误:

prog.cpp:26: error: no matching function for call to ‘Run(bool (Base::*)())’

(您可以在http://ideone.com/8NZkq处理该片段):

#include <iostream>

class Base {
public:
  bool foo() { return true; }
};

Base* x;

template<typename T>
struct Traits {
  typedef bool (T::*BoolMethodPtr)();
};

template<typename T>
void Run(typename Traits<T>::BoolMethodPtr check) {
  T* y = dynamic_cast<T*>(x);
  std::cout << (y->*check)();
}

int main() {
  Base y;
  x = &y;
  Run<Base>(&Base::foo);
  Run(&Base::foo); // why error?
}

解决方法:

特征中的T< T> :: BoolMethodPtr处于非推导的上下文中,因此编译器不会自动从调用中推断出T应该是什么类型.
这是因为可能有这样的代码:

template<typename T>
struct Traits {
  typedef bool (T::*BoolMethodPtr)();
};

template<>
struct Traits<int> {
  typedef bool (Base::*BoolMethodPtr)();
};

Run(&Base::foo); /* What should T be deduced to? Base and int are both equally possible */

如果你没有Traits< T> class,你可以写Run:

template<class Class>
void Run(bool (Class::*check)()) {
  Class* y = dynamic_cast<Class*>(x);
  std::cout << (y->*check)();
}

在这种情况下,Class可以推断为Base

上一篇:PHP:类的特征和其他特征冲突


下一篇:php – 动态创建具有特征绑定的类