簡體   English   中英

C ++類繼承和模板

[英]C++ Class inheritance and templates

我想在我的C ++程序中寫一些類似於:

class A {
 public:
   void a();
}

template <class B extends A>
class C {
 B instance;
}

這可能嗎? 換句話說:C ++是否允許我說模板中的類是其他東西的子類?

定義一個名為extends (它只是一個糖塗層名稱)的元函數:

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

然后將您的類定義為:

template <class B>
class C 
{
   //here you can check it, and generate your own error message!
   static_assert(extends<B,A>(), 
                "Constraint Violation: B doesn't derive from A.");

   B instance;
};

或者,你可以寫這個:

//define it a bit differently now!
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;

template <class B, class Unused=extends<B,A>>
class C 
{
      B instance;
};

但在這種情況下,您沒有機會生成自己的錯誤消息。 編譯器可以隨意向您拋出任何可能難以理解的錯誤消息

無論如何,你可能意識到你可以直接使用std::is_base_of<> 但如果你正在尋找糖衣名稱 ,那么extends聽起來不錯!

不是直接的。 但是你可以將static_asserttype_traits一起使用,如下所示:

static_assert(is_base_of<A,B>::value, "C<B> requires B:A");

例如,您可以將它放在構造函數中,如果不滿足要求,則無法編譯。 請注意,這是所有C ++ 11的東西,但它在很久之前就存在於Boost中,或者你可以自己編寫代碼,如果你真的被卡住了(它不需要語言支持)。

暫無
暫無

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

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