2016-07-29 8 views
3

私はthisthisthisなど多くのものを読んでいますが、これらの投稿はいずれも私の特定の問題には該当しません。複数のパラメータパックを持つVariadicテンプレートコンストラクタ

私は可変長テンプレートコンストラクタを持つ構造体Xあります

struct X 
{ 
    template<typename... T> 
    X(T... t) { /*...*/ } 
}; 

をそして私はタイプXの2つのオブジェクトを含む構造Yを持っています。私は(明らかに動作しません)次のコードのようなもの、すなわち、適切に異なるパラメータリストを持つタイプXの両方のメンバーを初期化することができ、Yのテンプレートコンストラクタを定義したいと思います:

struct Y 
{ 
    template<typename... U, typename... V> 
    Y(U&&... u, V&&... v)        // this does not work 
     : x1(std::forward(u)...), x2(std::forward(v)...) // this is was I need to do 
     {} 

    X x1, x2; 
}; 

をどのようにできました私は、ラッパー、タプル、または任意の適切なメタプログラミング機械を使用して、それを行うのですか? C++ 14のソリューションが受け入れられます。

+0

@πάνταῥεῖ:私はC++ 14を求めています。あなたがリンクしている質問は、私の問題の適切な解決策かもしれませんが、それは2歳です!おそらく、C++を使用する方が良いでしょう。 – shrike

+0

私は、C++ 14がVTPの解凍について多くの変更を行ったとは確信していませんが、よく... –

+0

@πάνταῥεῖ:あなたはわかりませんか?私は確かにC++ 14はタプルをアンパックするためのいくつかの新しい興味深い機能を追加しました... – shrike

答えて

1

ボグスタンダードindex_sequenceトリック。

C++ 17では
struct Y 
{ 
private: 
    template<typename... U, typename... V, 
      std::size_t... UIs, std::size_t... VIs> 
    Y(std::tuple<U...>&& u, std::tuple<V...>&& v, 
     std::index_sequence<UIs...>, std::index_sequence<VIs...>) 
     : x1(std::get<UIs>(std::move(u))...), 
      x1(std::get<VIs>(std::move(v))...) 
     {} 
public: 
    template<typename... U, typename... V> 
    Y(std::tuple<U...> u, std::tuple<V...> v) 
     : Y(std::move(u), std::move(v), 
      std::index_sequence_for<U...>{}, 
      std::index_sequence_for<V...>{}) 
     {} 

    X x1, x2; 
}; 

、ちょうどmake_from_tuple使用:

struct Y 
{ 
public: 
    template<typename... U, typename... V> 
    Y(std::tuple<U...> u, std::tuple<V...> v) 
     : x1(std::make_from_tuple<X>(std::move(u))), 
      x2(std::make_from_tuple<X>(std::move(v))) 
     {} 

    X x1, x2; 
}; 
+0

ありがとう、あなたのトリックはうまくいきます...内側のオブジェクト 'x1' & 'x2';(私は' std :: forward_as_tuple()を使ってみましたが、これはうまくいかなかった)への参照を渡したい場合を除きます。参照のタプルで動作するようにコードを変更しますか? (私が必要とする完全な転送を表示するために私の質問を更新しました) – shrike

+0

変更の必要はありません。 –

+0

そうですよ!私はパラメータリストを間違えた。あなたのトリックも参考まで完璧に機能します。どうもありがとう。 – shrike

関連する問題