3

背景として、私が持っているコードは次のとおりです。

template<typename... Dummy>
struct tuple;

template <typename T, typename... TList>
struct tuple<T,TList...>
    :public tuple<TList...>
{
    typedef T value_type;

    tuple(){}

    template<typename A,typename... AList>
    tuple(const A& a,const AList&... args)
        :tuple<TList...>(args...),element(a)
    {
    }

    template<typename A,typename... AList>
    tuple(A&& a,AList&&... args)
        :tuple<TList...>(args...),element(a)
    {
    }

    tuple(const tuple<T,TList...>& a)
        :tuple<TList...>(a),element(a.element)
    {
    }

    tuple(tuple<T,TList...>&& a)
        :tuple<TList...>(a),element(a.element)
    {
    }

    static const index_t size=1+tuple<TList...>::size;
    static const index_t offset=sizeof(tuple<TList...>);

    tuple_unit<T> element;
};

template<typename T>
struct tuple<T>
{
    typedef T element_type;

    tuple(){}

    template<typename A>
    tuple(const A& a)
        :element(a)
    {
    }

    template<typename A>
    tuple(A&& a)
        :element(a)
    {       
    }

    tuple(const tuple<T>& a)
        :element(a.element)
    {
    }

    tuple(tuple<T>&& a)
        :element(a.element)
    {
    }

    static const index_t size=1;
    static const index_t offset=0;

    tuple_unit<T> element;
};

C++11 にはムーブ セマンティクスがあるため、プロジェクトにムーブ コンストラクターを追加しようとしました。しかし、結果は私の期待どおりではありません。

私が書くとき

tuple<int,float,double> a(3,5,7); //Success. Use 3,5,7 to init each element in tuple.
tuple<int,float,double> b(a); //Call template function,not copy ctor,and it failed.

私はこれを読んで、b(a)が呼び出されtemplate<typename A,typename... AList> tuple(A&& a,AList&&... args)A& &&に置き換えられると思いましたA&が、すでにコンストラクターがありtuple(const tuple<T>& a)ます。コンパイラは、テンプレート コンストラクターがコピー コンストラクターよりも優れていると考えるのはなぜですか?

問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

コンストラクター自体もテンプレートにする必要があるとは本当に思いません。以下を参照してください。また、タプル メンバーを初期化するときに、move コンストラクターで 'std::move' を使用することを検討してください。

template<typename... Dummy>
struct tuple;

template <typename T, typename... TList>
struct tuple<T,TList...>
  :public tuple<TList...>
{
  typedef T value_type;

  tuple(){}

  tuple(const T& a,const TList&... args)
    :tuple<TList...>(args...),element(a)
  {
  }

  tuple(T&& a,TList&&... args)
    :tuple<TList...>(args...),element(a)
  {
  }

  tuple(const tuple<T,TList...>& a)
    :tuple<TList...>(a),element(a.element)
  {
  }

  tuple(tuple<T,TList...>&& a)
    :tuple<TList...>(a),element(a.element)
  {
  }

  static const int size=1+tuple<TList...>::size;
  static const int offset=sizeof(tuple<TList...>);

  T element;
};

template<typename T>
struct tuple<T>
{
  typedef T element_type;

  tuple(){}

  tuple(const T& a)
    :element(a)
  {
  }

  tuple(T&& a)
    :element(a)
  {       
  }

  tuple(const tuple<T>& a)
    :element(a.element)
  {
  }

  tuple(tuple<T>&& a)
    :element(a.element)
  {
  }

  static const int size=1;
  static const int offset=0;

  T element;
};

int
main ()
{
  tuple<int,float,double> a(3,5,7); //Success. Use 3,5,7 to init each element in tuple.

  tuple<int,float,double> b(a); //Call template function,not copy ctor,and it failed.
}
于 2013-09-08T16:19:40.573 に答える