簡體   English   中英

C ++ 11:條件編譯:成員

[英]C++11: conditional compilation: members

我正在嘗試使用條件成員創建一個結構,這意味着,不同的成員只存在特定的特殊化。 但是,我希望這些課程盡可能快。 我試過三種不同的方式:

方式1:

 template<typename T, bool with_int = false>
 struct foo
 {
     template<typename... Args>
     foo(Args&&... args) : m_t(forward<Args>(args)...)
     {}

     T m_t;
 }

 template<typename T>
 struct foo<T, true>
 {
     template<typename... Args>
     foo(Args&&... args) : m_t(forward<Args>(args)...), m_id(0)
     {}

      T m_t;
      int m_id;
 };
  • Disadventage:每個專業化的重復代碼。

方式2:

 template<typename T, bool with_int = false>
 struct foo
 {
     template<typename... Args>
     foo(Args&&... args) : m_t(forward<Args>(args)...)
     {}

     virtual ~foo() {}

     T m_t;
 }

 template<typename T>
 struct foo<T, false> : public foo<T>
 {
      using foo<T>::foo;

      int m_id = 0;
 };
  • Adventage:代碼很少。
  • Disadventage:使用vtables /繼承/等:更多的時間在構建或訪問成員? 但是,換句話說,我不假裝使用“引用”來基類。 這種方法的真正冒險或不滿是什么?

方式3

 using nil_type = void*;
 using zero_type = nil_type[0];

 template<typename T, bool with_int = false>
 struct foo
 {
    template<typename... Args, typename = typename enable_if<with_int>::type>
    foo(Args&&... args) : m_t(forward<Args>(args)...), m_int(0)
    {}

    template<typename... Args, typename = typename enable_if<!with_int>::type>
    foo(Args&&... args) : m_t(forward<Args>(args)...)
    {}        

    T m__t;
    typename conditional<with_int, int, zero_type>::type m_int;
 };
  • Ventages:寫一次代碼; with_intfalse ,字段m_int大小為0(幾乎與gcc 4.7.2)。
  • Adventages:更多地使用模板(降低可讀性)並且我不確定編譯器如何處理大小為0的成員。我不確定大小0字段在多大程度上是危險的或有意義的。 重復的構造函數,但也許這是可以避免的。

什么是最好的方法或方法?

你考慮過繼承嗎?

template< bool >
struct foo_int_base
{
  // stuff without the int
  void f(); // does not use m_id
};

template<>
struct foo_int_base< true >
{
  // stuff with the int
  int m_id = 0;
  void f(); // uses m_id
};

template< typename T, bool with_int = false >
struct foo : foo_int_base< with_int >
{
  // common stuff here
};

暫無
暫無

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

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