采用以下类层次结构:
template<typename T>
class Foo {
public:
T fooMethod() { ... }
};
class Moo : public Foo<bool> {
...
};
如果我现在在哪里写Moo::fooMethod
,编译器将推导出Foo<bool>::fooMethod
。如何在编译时自己推断Foo<bool>
为fooMethod
的父级?
动机:编译器不允许Foo<bool>::fooMethod
作为bool (Moo::*)()
的模板参数传递,因为它在该上下文中将是bool (Foo<bool>::*)()
类型。但由于我有多重继承,所以我不知道父fooMethod
将会是什么,必须推断它。
答案 0 :(得分:1)
如果我正确理解了问题,可以使用以下特征推断出定义成员函数的类:
template<typename>
struct member_class_t;
template<typename R, typename C, typename... A>
struct member_class_t <R(C::*)(A...)> { using type = C; };
template<typename R, typename C, typename... A>
struct member_class_t <R(C::*)(A...) const> { using type = C const; };
// ...other qualifier specializations
template<typename M>
using member_class = typename member_class_t <M>::type;
之后你可以写
member_class<decltype(&Moo::fooMethod)>
给予Foo<bool>
。
要更一般地定义member_class
,您还应该考虑volatile
和ref
- 限定符,总共产生大约12个特化。完整的定义是here。