web-dev-qa-db-fra.com

Classe de triplets de type paire STL - puis-je rouler la mienne?

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?

27
einpoklum

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 ints 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>;
36
Joseph Mansfield

Si vous pouvez utiliser C++ 11, utilisez std :: Tuple

Sinon, utilisez boost :: Tuple

7
polkadotcadaver

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.

6
John Dibling

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;
3
iperetta