簡體   English   中英

檢查模板參數是否從類繼承

[英]Check if template argument is inherited from class

我想檢查給予模板的類型是否繼承自項目中的基類。

它應該像以下示例中所期望的那樣工作:

template< class T : public CBaseClass >
  • 是否可以使用模板執行此操作,如果沒有,我還能怎么做?

以下Stroustrup的一個例子

template<class Test, class Base>
struct AssertSameOrDerivedFrom {
  AssertSameOrDerivedFrom() { &constraints; }
public:
  static void constraints() {
    Test *pd = 0;
    Base *pb = pd;
  }
};

template<class T>
struct YourClass {
  YourClass() {
    AssertSameOrDerivedFrom<T, CBaseClass>();
  }
};

在C ++ 0x中,這變為:

template<class T>
struct YourClass {
  static_assert(std::is_base_of<CBaseClass, T>::value);
};

您可以使用Boost中的boost::is_base_and_derived ,結合BOOST_STATIC_ASSERT 如果您使用的是支持TR1或C ++ 0x的編譯器,那么標准庫中的這些構造就等價( std :: is_base_of ,C ++ 0x中的static_assert語句)。

如果你想斷言,那就去做Nurk吧。 如果要檢查,請使用boost或C ++ 0x中的is_base_of。 如果您不能使用其中任何一種,請使用SFINAE:

template < typename Base, typename PotentialDerived >
struct is_base
{
  typedef char (&no)  [1];
  typedef char (&yes) [2];

  static yes check(Base*);
  static no  check(...);

  enum { value = sizeof(check(static_cast<PotentialDerived*>(0))) == sizeof(yes) };
};

我想這不是問題。 3來自這個GotW項目

越短越好:

template <typename Base, typename Derived>
struct is_base {
    constexpr static bool check(Base*)   { return true; }
    constexpr static bool check(...)     { return false; }
    enum { value = check(static_cast<Derived*>(0)) };
};

例1:

struct A {};
struct B  : A { };

int main(void) {
    static_assert(is_base<A,B>::value, "If Error: A is not base of B");
}

例2:

template <bool, typename T=void>
struct Use {
    static std::string info() { return "Implementation that consider that A is not base of B"; }
};

template <typename T>
struct Use<true,T>  {
    static std::string info() { return "Implementation that consider that A is the base of B"; }
};


int main(void) {
    std::cout << Use<is_base<A,B>::value>::info(); //Implementation that consider that A is the base of B
}

暫無
暫無

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

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