可能な限りstd :: pairに類似したトリプレットクラスを使用したいと思います。 STLにはないようです。 Boostのように重いものを使いたくない。私がどこかから持ち上げることができるいくつかの便利なFOSS非制限ライセンストリプレットクラスはありますか?自分で転がすべきですか?私は他に完全に何かすべきですか?
編集:についてstd::Tuple
...
トリプレット固有のクラスに本当にメリットはありませんか?つまり、タプルではできません
template<typename T1, typename T2, typename T3> std::Tuple<T1, T2, T3> triple;
今私はできますか?個々の型の組み合わせのトリプルをtypedefする必要はありませんか?
いいえ、自分でロールバックしないでください。代わりに、 std::Tuple
を見てください。これはstd::pair
の一般化です。だからここにint
sの値で初期化されたトリプルがあります:
std::Tuple<int, int, int> triple;
必要に応じて、トリプルのみにタイプエイリアスを設定できます。
template<typename T1, typename T2, typename T3>
using triple = std::Tuple<T1, T2, T3>;
C++ 11を使用できる場合は、std :: Tupleを使用します
そうでない場合は、boost :: Tupleを使用します
C++ 11を使用している場合は、 std::Tuple
。
C++ 03を使用している場合は、独自にローリングする(それほど難しくはない)か、BoostのTuple
を使用する必要があります。
私はあなたがこのようなものが必要だと思います:
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;