簡體   English   中英

使用可變參數模板解決C ++中的mixin構造函數問題

[英]Solving the mixin constructor problem in C++ using variadic templates

我最近解決了構造函數問題 ,其中相互裝飾的各種mixins類(以及最頂層的宿主類)具有不同的構造函數簽名。 為了在結果修飾的類中維護單個構造函數,並且不添加init函數,我找到了以下解決方案。 它對mixin類的唯一限制是,如果它的構造函數需要多個參數,它們都應該封裝在一個元組中。 (用g ++編譯此代碼需要-std = c ++ 0x標志)

#include <boost/tuple/tuple.hpp>

// Base class for all mixins
struct Host {
    float f_;
    int i_;

    Host(float f, int i) : f_(f), i_(i) {}
};

// First mixin--constructs with 1 parameter
template <class B>
struct M1 : public B {
    char c_;

    template <class... A>
    M1(char c, const A&... a) : B(a...), c_(c) {}
};

// Second mixin--constructs with 3 parameters
template <class B>
struct M2 : public B {
    double d_;
    short s_;
    const char* p_;

    template <class... A>
    M2(boost::tuple<const char*, double, short> t, const A&... a)
    : B(a...), p_(t.get<0>()), d_(t.get<1>()), s_(t.get<2>()) {}
};


int main() {
    // ctor parameters go in this order, from most derived to base:
    M2<M1<Host>> tst(boost::make_tuple("test", 46.1, (short)-1), (char)5, 4.2f, 2);
  return 0;
}

我的問題是:
1)使用C ++ 0X有沒有更好,更優雅的方法來解決這個問題?
2)具體來說,元組真的有必要嗎?

如果你有多個具有不同arity的構造函數(因此含糊不清),你只需要像元組這樣的東西。

如果不是,您可以像往常一樣處理mixin的參數:

template <class... A>
M2(const char* p, double d, short s, const A&... a)
  : B(a...), p_(p), d_(d), s_(s) {}

你可以構造基礎結構並將其作為M1和M2的構造函數參數傳遞,這樣它們就可以調用b的復制構造函數:

M2(const B &b, ....) : B(b), ....

你真的確定你需要繼承嗎? 構圖更優雅,更易於維護。

暫無
暫無

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

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