我知道在java中我们可以这样做:
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());
...
答案 0 :(得分:6)
是的,您可以使用SFINAE:
#include <type_traits>
template <typename T, typename std::enable_if<std::is_base_of<B, T>::value>::type* = nullptr>
class A
{
// ...
};
答案 1 :(得分:4)
作为SFINAE的替代方案,您可以使用static_assert
:
#include <type_traits>
template <typename T>
class A
{
static_assert(std::is_base_of<BaseClass, T>::value, "error message");
};