有没有办法继承别名模板?
Is there any way to inherit an alias template?
我有一个模板基类:
template<class EntityManager>
class System {
public:
virtual void Update(EntityManager& entity_manager, double dt) = 0;
protected:
template<typename T> using Component = typename EntityManager::template Component<T>;
};
我想在我的派生模板类中使用 Component<T>
。
我尝试让 System
将 Component
声明为它自己的类,但是当我尝试引用它时,编译器返回 'Component' was not declared in this scope.
有什么建议吗?
编辑:
目标用法:
template class<typename EntityManager>
class MovementSystem : public System<EntityManager> {
public:
virtual void Update(EntityManager& entity_manager, double dt) {
Component<Position> position_component; // I'd like to use Component<T> here.
}
};
在派生的 class 模板中(这很可能是你的意思)你可以做
using Component = typename System<T>::Component;
其中 T
是派生的 class 中的某个适当类型。
处理模板你可以这样做:
template< class U > using Component = typename System<T>::template Component<U>;
正如 dyp 在评论中指出的那样。
细节取决于上下文,这里是 concrete example 为您在编辑 post 时给出的代码:
class ET
{
public:
template< class Type >
struct Component {};
};
template<class EntityManager>
class System {
public:
virtual void Update(EntityManager& entity_manager, double dt) = 0;
protected:
template<typename T> using Component = typename EntityManager::template Component<T>;
};
template< class EntityManager >
class MovementSystem : public System<EntityManager> {
public:
#ifndef DONTFIXIT
template< class T > using Component = typename EntityManager::template Component< T >;
#endif
virtual void Update(EntityManager& entity_manager, double dt) {
Component<int> position_component; // I'd like to use Component<T> here.
}
};
auto main() -> int
{
MovementSystem< ET > ms;
}
抱歉,没有简单的方法可以做到这一点。
这显然是一个核心语言有可能更好地支持程序员的领域,避免一遍又一遍地重述一个名字。
这种语言的基本原理是,System
的某些特化可能不一定定义 Component
类型或可访问的类型。
使用 using
可以让编译器预先诊断是否缺少此类类型。
我有一个模板基类:
template<class EntityManager>
class System {
public:
virtual void Update(EntityManager& entity_manager, double dt) = 0;
protected:
template<typename T> using Component = typename EntityManager::template Component<T>;
};
我想在我的派生模板类中使用 Component<T>
。
我尝试让 System
将 Component
声明为它自己的类,但是当我尝试引用它时,编译器返回 'Component' was not declared in this scope.
有什么建议吗?
编辑: 目标用法:
template class<typename EntityManager>
class MovementSystem : public System<EntityManager> {
public:
virtual void Update(EntityManager& entity_manager, double dt) {
Component<Position> position_component; // I'd like to use Component<T> here.
}
};
在派生的 class 模板中(这很可能是你的意思)你可以做
using Component = typename System<T>::Component;
其中 T
是派生的 class 中的某个适当类型。
处理模板你可以这样做:
template< class U > using Component = typename System<T>::template Component<U>;
正如 dyp 在评论中指出的那样。
细节取决于上下文,这里是 concrete example 为您在编辑 post 时给出的代码:
class ET
{
public:
template< class Type >
struct Component {};
};
template<class EntityManager>
class System {
public:
virtual void Update(EntityManager& entity_manager, double dt) = 0;
protected:
template<typename T> using Component = typename EntityManager::template Component<T>;
};
template< class EntityManager >
class MovementSystem : public System<EntityManager> {
public:
#ifndef DONTFIXIT
template< class T > using Component = typename EntityManager::template Component< T >;
#endif
virtual void Update(EntityManager& entity_manager, double dt) {
Component<int> position_component; // I'd like to use Component<T> here.
}
};
auto main() -> int
{
MovementSystem< ET > ms;
}
抱歉,没有简单的方法可以做到这一点。
这显然是一个核心语言有可能更好地支持程序员的领域,避免一遍又一遍地重述一个名字。
这种语言的基本原理是,System
的某些特化可能不一定定义 Component
类型或可访问的类型。
使用 using
可以让编译器预先诊断是否缺少此类类型。