通常,如果您希望 A 继承 B,那么 B 除了 A 的声明之外无法知道有关 A 的任何信息:
template < class __object >
struct Derived;
不幸的是,您想要获得更多,因此您必须使用类型特征:
template<class __derived>
struct Base_traits {
//using Object = ?????;
};
template<class __object>
struct Base_traits<Derived<__object>> {
using Object = __object; //note, this also can't inspect B.
};
The Base
类可以检查Base_traits
它想要的一切,因为特征不会检查B
根本不。
template < class __derived, class __object = typename Base_traits<__derived>::Object >
struct Base {
using Derived = __derived;
using Object = typename Base_traits<__derived>::Object;
//or
using Object = __object;
Unrelated, leading double underscores are disallowed for use by mortals, use a single leading underscore followed by a lowercase letter. Alternatively, use a trailing underscore.
另外,语法
void function(Object o) { return Derived::function(s); }
不起作用,因为该表示法不能用于向上转型,只能用于向下转型。因此,你必须使用static_cast
on the this
。因为这有点难看,我把它放在一个函数后面:
void foo(Object o) { self()->bar(o); }
private:
__derived* self() {return static_cast<__derived*>(this);}
const __derived* self() const {return static_cast<__derived*>(this);}
};
完整代码:http://coliru.stacked-crooked.com/a/81595b0fcd36ab93 http://coliru.stacked-crooked.com/a/81595b0fcd36ab93