1

我知道在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());
...
4

2 回答 2

6

是的,您可以使用SFINAE

#include <type_traits>

template <typename T, typename std::enable_if<std::is_base_of<B, T>::value>::type* = nullptr>
class A
{
    // ...
};

这是一个演示其使用的演示。

于 2013-06-08T20:43:28.213 回答
4

作为 SFINAE 的替代方案,您可以使用static_assert

#include <type_traits>
template <typename T>
class A
{
    static_assert(std::is_base_of<BaseClass, T>::value, "error message");
};
于 2013-06-08T20:44:31.040 回答