C++中的子类模板
我知道在java中我们可以做到这一点:C++中的子类模板,c++,oop,templates,C++,Oop,Templates,我知道在java中我们可以做到这一点: class A<T extends B> { ... } 我们可以用C++中的模板做同样的事情吗? 例如,我想要有一个模板类a,其中我们传递的模板T是另一个类B的子类,如上面的java示例。有什么想法吗 编辑: 在其中一个答案中,我被要求显示我的代码,因为我在使用答案时出现了链接错误。 这里是从深层到深层的: //ComponentManager.h ... template <typename T, typename std::en
class A<T extends B>
{
...
}
<>我们可以用C++中的模板做同样的事情吗?
例如,我想要有一个模板类a,其中我们传递的模板T是另一个类B的子类,如上面的java示例。有什么想法吗
编辑:
在其中一个答案中,我被要求显示我的代码,因为我在使用答案时出现了链接错误。
这里是从深层到深层的:
//ComponentManager.h
...
template <typename T, typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
Component* AddComponent(rUUID uuid);
...
//ComponentManager.cpp
...
template <typename T, typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
Component* ComponentManager::AddComponent(rUUID uuid)
{
...
}
//Engine.h
...
template <typename T, typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
void AddComponent(rUUID);
...
//Engine.cpp
...
template <typename T, typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr>
void Engine::AddComponent(rUUID uuid)
{
...
}
...
//main.cpp
...
e.AddComponent<Position>(a->GetUUID());
...
是的,您可以使用:
是的,您可以使用:
作为SFINAE的替代方案,您可以使用静态断言:
作为SFINAE的替代方案,您可以使用静态断言:
你想传递一个B的泛型子元素?is_base_of::type可能会这样做这只是有点道理,因为如果T满足a的要求,它就会工作,否则它不会编译。@Unit978:是的,我想在类中传递B的模板子类TA@TheArtist:为什么要这样做?排除不是B的子类的模板参数?要传递B的泛型子类?is_base_of::type可能会这样做这只是有点道理,因为如果t满足a的要求,它就可以工作,否则它不会编译。@Unit978:是的,我想在类中传递B的模板子类TA@TheArtist:为什么要这样做,以排除不是B的子类的模板参数?这是我想要的,但我无法使其与成员函数一起工作,我得到链接错误:/。。。有什么想法吗?@艺术家,你能给我看看你正在使用的代码吗?我发现很难理解函数与此有什么关系我编辑了上面的帖子,请检查并告诉我你是否找到了解决方案@您的问题是,模板只能在声明它的翻译单元中定义。否则会出现链接器错误。但是,可以在使用方法的cpp文件中包含方法的显式实例化。例如:模板void引擎::AddComponentrUUID;。另一个选项是简单地将定义与其声明合并。链接错误也是:错误1错误LNK2019:未解析的外部符号public:void\uuu thiscall Engine::AddComponentclass rUUID$AddComponent@VPosition@@$0A@@Engine@@QAEXVrUUID@@@Z在函数\u main中引用这是我想要的,但我无法使其与成员一起工作函数,我得到链接错误:/。。。有什么想法吗?@艺术家,你能给我看看你正在使用的代码吗?我发现很难理解函数与此有什么关系我编辑了上面的帖子,请检查并告诉我你是否找到了解决方案@您的问题是,模板只能在声明它的翻译单元中定义。否则会出现链接器错误。但是,可以在使用方法的cpp文件中包含方法的显式实例化。例如:模板void引擎::AddComponentrUUID;。另一个选项是简单地将定义与其声明合并。链接错误也是:错误1错误LNK2019:未解析的外部符号public:void\uuu thiscall Engine::AddComponentclass rUUID$AddComponent@VPosition@@$0A@@Engine@@QAEXVrUUID@@@Z在函数\u main中引用
#include <type_traits>
template <typename T, typename std::enable_if<std::is_base_of<B, T>::value>::type* = nullptr>
class A
{
// ...
};
#include <type_traits>
template <typename T>
class A
{
static_assert(std::is_base_of<BaseClass, T>::value, "error message");
};