Я хочу использовать триплетный класс, максимально похожий на std :: pair. STL, похоже, не имеет. Я не хочу использовать что-то слишком тяжелое, например, Boost. Есть ли какой-нибудь полезный триплет-класс FOSS с неограниченной лицензией, который я мог бы откуда-то поднять? Должен ли я свернуть свой собственный? Должен ли я сделать что-то еще полностью?
Редактировать: Около std::tuple
…
Неужели нет никакой пользы для триплетного класса? Я имею в виду, с кортежем, я не могу сделать
template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
теперь я могу? Должен ли я печатать тройки отдельных типов?
Нет, не катай свои собственные. Вместо этого взгляните на 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, то вам нужно будет либо прибегнуть к собственным (что не так уж сложно), либо использовать tuple
от Boost.
Я думаю, что вам нужно что-то вроде этого:
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;
Чтобы добавить аспект сходства с std :: pair, вы можете определить класс, у которого есть первый, второй и третий. Я предполагаю, что в этом случае вы не можете избежать создания подкласса std :: pair и добавить «третий» член. Это несколько строк кода.
Кроме того, если вы часто используете эти вещи с одним и тем же типом, вы также можете создавать классы-близнецы и триплеты. Легко делается с использованием C ++ — 11, например:
template <typename T> using twins = std::pair<T,T>;