簡體   English   中英

c ++模板特化和派生

[英]c++ template specialization and derivation

當使用這樣的模板時:

class A {…}
class B : A {…}
class C : A {…}

template<typename T>
class D{…}

我需要 T 只能是 B 或 C。這意味着 T 必須是 A 的派生。

有沒有辦法做到這一點? 謝謝!

std::is_base_ofstd::enable_if一起使用:

template<typename T, typename X = std::enable_if<std::is_base_of<A, T>::value>::type>
class D{...}

請注意,只要它從A派生,它就會接受任何T 如果您需要TBC ,那么您需要修改它,並使用std::is_same或/和std::conditional以及std::enable_if

你可以把它弄干凈:

template<typename T, typename Unused = extends<T,A>>
class D{...}

其中extends定義為:

template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;

如果您希望它導致錯誤和編譯失敗,也可以使用static_assert (如其他答案所示)。 但是,如果您需要選擇或取消選擇,例如來自許多專業,則使用上述方法。

希望有幫助。

您可以將static_assertstd::is_base_of結合使用:

#include <type_traits>

class A {};
class B : A {};
class C : A {};
class X{};

template<typename T>
class D
{
    static_assert(std::is_base_of<A,T>::value, "T must be derived from A");
};

int main()
{
    D<C> d_valid;
    D<X> d_fails; // compilation fails

    return 0;
}

住在ideone上

是的,應該這樣做:

template<typename T>
class D {
 static_assert(std::is_base_of<A,T>::value, "not derived from A");
 // ...
};

演示在這里。

但這不是模板背后的想法。 如果您編寫模板化代碼,那么它應該是通用的,即適用於支持您對其應用的操作的所有類型。

暫無
暫無

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

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