tuple - tuplas c++
Clase de triplete similar a un par de STL: ¿hago mi propia tirada? (5)
Creo que necesitas algo como esto:
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;
}
Ejemplos de uso:
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;
Estoy usando esto y es suficiente para mis propósitos ... Si quieres tipos diferentes, solo haz algunas modificaciones:
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;
}
Y el uso será muy similar:
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;
Quiero usar una clase triplete, lo más similar posible a std :: pair. STL no parece tener uno. No quiero usar algo demasiado pesado, como Boost. ¿Existe alguna clase útil de trío con licencia no restrictiva de FOSS que pueda sacar de algún lado? ¿Debo rodar mi propio? ¿Debo hacer algo completamente distinto?
Edit: Acerca de std::tuple
...
¿Realmente no hay ningún beneficio para una clase específica de triplete? Quiero decir, con tuple, no puedo hacer.
template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
ahora puedo ¿No tendré que typedef de triples de combinación de tipo individual?
No, no ruedes el tuyo. En su lugar, eche un vistazo a std::tuple
- es una generalización de std::pair
. Así que aquí hay un triple de valor inicializado de int
s:
std::tuple<int, int, int> triple;
Si lo desea, puede tener un alias de tipo solo para triples:
template<typename T1, typename T2, typename T3>
using triple = std::tuple<T1, T2, T3>;
Para agregar el aspecto de similitud a std :: pair, puede definir una clase que tenga primero, segundo y tercero. Mi conjetura es que, en ese caso, no puede evitar crear una subclase de std :: pair y agregar un ''tercer'' miembro. Son unas pocas líneas de código.
Además, si a menudo usas estas cosas con el mismo tipo, también podrías hacer clases de gemelos y trillizos. Fácilmente hecho con ''uso'' de C ++ - 11, como:
template <typename T> using twins = std::pair<T,T>;
Si está utilizando C ++ 11, puede usar std::tuple
.
Si estás usando C ++ 03, entonces tendrás que recurrir a rodar el tuyo (que no es demasiado difícil), o usar la tuple
de Boost.
Si puedes usar C ++ 11, usa std :: tuple
Si no, usa boost :: tuple