1

ユニバーサル コピー コンストラクター (任意の引数型を受け取るコンストラクター) を作成する場合は、次のように簡単に作成できます。

class Widget {
public:
  template<typename T> Widget(T&& other);
};

これは、コンパイラが従来のコピー コンストラクターを生成することを妨げるものではないので、それを自分で記述してテンプレートに委譲したいと思います。しかし、どうすればそれを行うことができますか?

class Widget {
public:
  template<typename T> Widget(T&& other);
  Widget(const Widget& other): ??? {}         // how delegate to the template?
};

この方法で委任コンストラクターを記述しようとしましたが、

Widget(const Widget& other): Widget<const Widget&>(other){}

しかし、VC11、gcc 4.8、clang 3.2 はすべて拒否します。

作成しようとしている委任コピー コンストラクターを作成するにはどうすればよいですか?

4

1 に答える 1

3

コンストラクター テンプレートにテンプレート引数を指定することはできません。あなたは控除に制限されています。たぶん、私の古い投稿の1つからの回答を適応させることができます:

// NOT Tested!
#include <utility>

class Widget
{
    enum fwd_t { fwd };

    // Your true master constructor
    template< typename T >  Widget( fwd_t, T &&t );

public:
    template < typename T >
    Widget( T&& other );
        : Widget( fwd, std::forward<T>(other) )
    {}
    Widget( const Widget& other )
        : Widget( fwd, other )
    {}
};

2 つの引数が 1 つのコンストラクターは、引数が 2 つの兄弟コンストラクターに転送されます。

于 2013-04-29T06:33:30.140 に答える