Je veux utiliser une classe triplet, aussi similaire que possible à std :: pair. STL ne semble pas en avoir. Je ne veux pas utiliser quelque chose de trop lourd, comme Boost. Existe-t-il une classe de triplet FOSS non-restrictive-license utile que je pourrais retirer de quelque part? Dois-je rouler le mien? Dois-je faire autre chose entièrement?
Modifier: À propos de std::Tuple
...
N'y a-t-il vraiment aucun avantage à une classe spécifique au triplet? Je veux dire, avec Tuple, je ne peux pas faire
template<typename T1, typename T2, typename T3> std::Tuple<T1, T2, T3> triple;
maintenant je peux? Ne devrais-je pas taper des triplets de combinaison de types individuels?
Non, ne lancez pas le vôtre. Jetez plutôt un œil à std::Tuple
- c'est une généralisation de std::pair
. Voici donc un triple de int
s initialisé en valeur:
std::Tuple<int, int, int> triple;
Si vous le souhaitez, vous pouvez avoir un alias de type pour les triples uniquement:
template<typename T1, typename T2, typename T3>
using triple = std::Tuple<T1, T2, T3>;
Si vous pouvez utiliser C++ 11, utilisez std :: Tuple
Sinon, utilisez boost :: Tuple
Si vous utilisez C++ 11, vous pouvez utiliser std::Tuple
.
Si vous utilisez C++ 03, vous devrez soit recourir au roulement (ce qui n'est pas trop difficile), soit utiliser Tuple
de Boost.
Je pense que vous avez besoin de quelque chose comme ça:
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;
}
Exemples d'utilisation:
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;
J'utilise ceci et c'est suffisant pour mes besoins ... Si vous voulez différents types, cependant, faites quelques modifications:
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;
}
Et l'utilisation sera très similaire:
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;