2017-08-16 10 views
1

私はstd :: tupleから派生したクラスにいくつかの値を代入しようとしていました。 私が最初に考えたのは、make_tupleを使用して、それをoperator=とコピーすることでしたが、それはうまくいきませんでした。std :: tupleをコピーする

タプルの値を手動で代入した場合、問題はありませんでした。のみ与えassign3

結果は
#include <tuple> 
template <class idtype> 
class Userdata: public std::tuple<idtype, WideString, int> 
{ 
    public: 
    /* compile error 
    void assign1(const idtype& id, const WideString& name, const int lvl) 
    { 
    (*this)=std::make_tuple(id, name, lvl); 
    } 
    */ 
    void assign2(const idtype& id, const WideString& name, const int lvl) 
    { 
    (std::tuple<idtype, WideString, int>)(*this)=std::make_tuple(id, name, lvl); 
    } 
    void assign3(const idtype& id, const WideString& name, const int lvl) 
    { 
    std::get<0>(*this)=id; 
    std::get<1>(*this)=name; 
    std::get<2>(*this)=lvl; 
    } 
    void print(const WideString& testname) const 
    { 
    std::cout << testname << ": " << std::get<0>(*this) << " " << std::get<1>(*this) << " " << std::get<2>(*this) << std::endl; 
    } 

    Userdata() 
    { 
    } 

}; 


int main(int argc, char *argv[]) 
{ 
    Userdata<int> test; 
    /* 
    test.assign1("assign1", 1, "test1", 1); 
    test.print(); 
    */ 
    test.assign2(2, "test2", 2); 
    test.print("assign2"); 
    test.assign3(3, "test3", 3); 
    test.print("assign3"); 
} 

assign2: 0 0 
assign3: 3 test3 3 

だから私は、コードの小さな作品を書いている、特にこの単一のものをテストするために、プロジェクトからそれを抽出します期待される結果。 したがって、私は簡単にassign3関数を使うことができますが、私はまだassign2で何が問題なのか疑問に思っています。

+3

Btw、単純な構成ではなく、ここに継承してもよろしいですか? –

+0

@BaummitAugen私は同じことを提案しようとしていましたが、私が把握していないものがあるかもしれないと考えました。 –

+0

@BaummitAugen下記の返信をありがとう。はい、私は継承が必要でした。なぜなら、他の関数がそこでタプルとやりとりすることを期待しているからです。 :) – DrHell

答えて

2
(std::tuple<idtype, WideString, int>)(*this) 

に割り当てた新しい一時ファイルを作成します。代わりに参照するようにキャスト:

(std::tuple<idtype, WideString, int>&)(*this)=std::make_tuple(id, name, lvl); 
関連する問題