有谁知道如何欺骗C++编译器来编译类似的东西(条件是TheObservedObject保留在MyClass中):
template< typename Type >
class Observabile
{
public:
typename typedef Type::TheObservedObject TheObject;
void Observe( TheObject& obj ) {}
};
class MyClass : public Observabile< MyClass >
{
public:
class TheObservedObject
{
};
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不可能直接实现,因为MyClass在实例化 时Observable尚未完成,因此您无法访问任何typedefs。您可以通过添加一个小包装来解决此问题:
template< typename Type, typename Wrapper >
class Observable
{
public:
typename typedef Wrapper::TheObservedObject TheObject;
void Observe( TheObject& obj ) {}
};
struct MyClassWrapper{
class TheObservedObject
{
};
};
class MyClass : public Observable< MyClass, MyClassWrapper>
{
public:
typedef MyClassWrapper::TheObservedObject TheObservedObject;
};
Run Code Online (Sandbox Code Playgroud)
或者一般只是TheObservedObject放在MyClass(Wrapper).