[英]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_of
與std::enable_if
一起使用:
template<typename T, typename X = std::enable_if<std::is_base_of<A, T>::value>::type>
class D{...}
請注意,只要它從A
派生,它就會接受任何T
。 如果您需要T
為B
或C
,那么您需要修改它,並使用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_assert
與std::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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.