3

私が作成しているクラスがあり、そのコンストラクターの 1 つに特別な型を使用します。このクラスは、要件に合った任意の型にすることができます。このテンプレート化されたコンストラクターが原因で、コピー コンストラクターとムーブ コンストラクターが不正なオーバーロードになるという問題に遭遇しました。

私のクラスは次のようにレイアウトされています:

template<typename ... Types>
class myclass{
    public:
        myclass(const myclass &other){/* copy constructor */}
        myclass(myclass &&other){/* move constructor */}

        template<typename Special>
        myclass(Special &&arg){/* stops copy/move implementations */}
}

この制限を回避するにはどうすればよいですか?

4

2 に答える 2

5

拘束します。

template<typename Special,
         std::enable_if_t<!std::is_same<std::decay_t<Special>, myclass>{}, int> = 0 >
myclass(Special &&arg) { /* ... */ }

特定のユース ケースによってはSpecial、要件に適合するタイプのみにさらに制限することもできます。

于 2015-07-31T07:38:22.603 に答える