web-dev-qa-db-ja.com

STLペアのようなトリプレットクラス-自分でロールすることはできますか?

可能な限りstd :: pairに類似したトリプレットクラスを使用したいと思います。 STLにはないようです。 Boostのように重いものを使いたくない。私がどこかから持ち上げることができるいくつかの便利なFOSS非制限ライセンストリプレットクラスはありますか?自分で転がすべきですか?私は他に完全に何かすべきですか?

編集:についてstd::Tuple...

トリプレット固有のクラスに本当にメリットはありませんか?つまり、タプルではできません

template<typename T1, typename T2, typename T3> std::Tuple<T1, T2, T3> triple;

今私はできますか?個々の型の組み合わせのトリプルをtypedefする必要はありませんか?

27
einpoklum

いいえ、自分でロールバックしないでください。代わりに、 std::Tuple を見てください。これはstd::pairの一般化です。だからここにintsの値で初期化されたトリプルがあります:

std::Tuple<int, int, int> triple;

必要に応じて、トリプルのみにタイプエイリアスを設定できます。

template<typename T1, typename T2, typename T3>
using triple = std::Tuple<T1, T2, T3>;
36

C++ 11を使用できる場合は、std :: Tupleを使用します

そうでない場合は、boost :: Tupleを使用します

7
polkadotcadaver

C++ 11を使用している場合は、 std::Tuple

C++ 03を使用している場合は、独自にローリングする(それほど難しくはない)か、BoostのTupleを使用する必要があります。

6
John Dibling

私はあなたがこのようなものが必要だと思います:

template<typename T>
struct triplet
{
    T first, middle, last;
};

template<typename T>
triplet<T> make_triplet(const T &m1, const T &m2, const T &m3) 
{
    triplet<T> ans;
    ans.first = m1;
    ans.middle = m2;
    ans.last = m3;
    return ans;
}

使用例:

triplet<double> aaa;
aaa = make_triplet<double>(1.,2.,3.);
cout << aaa.first << " " << aaa.middle << " "  << aaa.last << endl;

triplet<bool> bbb = make_triplet<bool>(false,true,false);
cout << bbb.first << " " << bbb.middle << " "  << bbb.last << endl;

私はこれを使用しており、それは私の目的には十分です...しかし、異なるタイプが必要な場合は、いくつかの変更を行ってください:

template<typename T1, typename T2, typename T3>
struct triplet
{
    T1 first; 
    T2 middle;
    T3 last;
};

template<typename T1, typename T2, typename T3>
triplet<T1,T2,T3> make_triplet(const T1 &m1, const T2 &m2, const T3 &m3) 
{
    triplet<T1,T2,T3> ans;
    ans.first = m1;
    ans.middle = m2;
    ans.last = m3;
    return ans;
}

そして使い方は非常に似ています:

triplet<bool,string,myDouble> ccc;
ccc = make_triplet<bool,string,double>(false,"AB",3.1415);
ccc.middle = "PI";
cout << ccc.first << " " << ccc.middle << " "  << ccc.last << endl;
3
iperetta