0

これが以前に尋ねられた場合は申し訳ありません-明確な答えがなく検索されました.それが可能かどうかさえ疑問に思い始めています. C++11 を学習しようとしていますが、可変個引数テンプレートで問題が発生しました。可変引数関数パラメーターの概念と、それらをアンラップして処理するために再帰を使用する理由/方法を (最終的に) 把握していると思いますが、クラス コンストラクターで (私が思うに) 同様の概念に問題があります。

混合型コンテナー (タプルを想定) をプライベート メンバーとして持つ可変個引数テンプレート クラスを作成するとします。クラスオブジェクトの構築時に、任意の数のさまざまな型のオブジェクトをそのタプルにプッシュすることは可能ですか? 何かのようなもの:

#include <tuple>

// forward declaration - is this needed?
template <class ... args>
class myClass;

template <class H, class ... T>
class myClass <H, T ...>
{
 private:
     std::tuple<anything can go here> mycontainer;
 public:
     myClass(const H& head, const T& ... tail)
     {
            push head into mycontainer;
            do some sort of recursion with tail;
     }
}

私は std::tuple_cat と std::make_tuple をいじっていて、しばらくの間何かに取り組んでいると思っていましたが、うまくいきませんでした。

私が C++ に関わってから長い時間が経ちました。C++11の機能について読んだ後、これを見始めました。

編集:GCC 4.8.xおよび/またはVisual Studio 2012を使用していることを追加するだけです

4

1 に答える 1

1

はい、これらの可変長型の一部からメンバーを構築することは可能です。例えば:

template <class ... T>
class myClass {
  std::tuple<T...> mytuple;
public:
  // Constructor that takes const refs to the Ts and constructs tuple:
  myclass(const T&... args) : mytuple(args...) {}

  // Perfect forwarding constructor that will try to construct tuple
  // from arbitrary lvalue/rvalue parameters:
  template <class... Args>
  myclass(Args&&... args) : mytuple(std::forward<Args>(args)...) {}
};

より具体的なことを求める場合は、より詳細に説明する必要があります。

于 2013-07-19T02:40:50.610 に答える