在C ++中推导继承方法的父类

时间:2014-05-05 00:49:53

标签: c++ inheritance

采用以下类层次结构:

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将会是什么,必须推断它。

1 个答案:

答案 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,您还应该考虑volatileref - 限定符,总共产生大约12个特化。完整的定义是here

相关问题