1

私は可変長テンプレートコンストラクタを持つテンプレートクラスを持っています:tmpタイプのMyClassを構築してください。std::swapすべてのメンバーは*thisです。sourceのメンバーはすべて*this*と入れ替えます。今tmpは...すべてのゴミ*this*が持っていたと私はちょうど私のコンストラクタの範囲はtmpを削除するの世話をしてみましょう含ま可変長引数テンプレートコンストラクタと移動コンストラクタ

しかし、ここで私がこだわっていると、私のMyClass tmp(???)オブジェクトを構築する方法がわかりません。

+2

簡単に、あなたがほとんどでした'MyClass(MyClass && source)/ * ...ここにいくつかのものがあります。* /' –

+1

何が問題なのですか?可変コンストラクタは移動コンストラクタと何をするのですか? – 101010

+0

'tmp'オブジェクトをビルドするにはどうしたらいいですか?私はそこに置くべき引数がどれくらいあるのかよくわかりません。ソースの内部状態に応じて手動で適切なコンストラクタを呼び出すだけでいいですか?どのようにtmpを構築するためにコンストラクタを呼び出すのですか?いくつの引数がありますか? – MCF

答えて

0

問題は、引数Ts&&...MyClass<T,nb>&(つまり非const)と一致する可能性があることです。これは、auto b = a;とそれに類するもの(aはconstではないため)の場合に、より良い一致になります。

だから、いくつかのSFNAEの魔法で、その場合を無効にするか、正しいことをして、特定の過負荷を提供する必要があります、次のいずれか

期待出力

#include <memory> 
#include <string> 
#include <iostream> 

template<typename T, int nb = 1> 
class MyClass 
{ 
    /* ... some stuff here ... */ 

public: 
    template<typename... Ts> 
    MyClass(Ts&&... ts) 
    : _pstr(std::make_shared<std::string>(std::forward<Ts>(ts)...)) 
    { 
    } 

    // match the specific case, and force a copy 
    MyClass(MyClass<T, nb>& r) 
    : MyClass(static_cast<const MyClass<T, nb>&>(r)) 
    {} 

    // and now we must match all copy/move operations   
    MyClass(const MyClass<T, nb>&) = default; 
    MyClass& operator=(const MyClass<T, nb>&) = default; 
    MyClass(MyClass<T, nb>&&) = default; 
    MyClass& operator=(MyClass<T, nb>&&) = default; 

    void print() const { 
     std::cout << *_pstr << std::endl; 
    } 
private: 
    std::shared_ptr<std::string> _pstr; 

}; 

// test 
int main() 
{ 
    auto a = MyClass<int>("hello, world"); 
    auto b = a; 
    auto c = MyClass<int>("goodbye"); 
    auto d = c; 
    b = c; 
    a.print(); 
    b.print(); 
    c.print(); 
    d.print(); 
} 

hello, world 
goodbye 
goodbye 
goodbye 
関連する問題