簡體   English   中英

C ++中的子類模板

[英]Subclass template in C++

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

是的,您可以使用SFINAE

#include <type_traits>

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

這是演示其用法的演示。

作為SFINAE的替代方法,您可以使用static_assert

#include <type_traits>
template <typename T>
class A
{
    static_assert(std::is_base_of<BaseClass, T>::value, "error message");
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM