STL-пара-подобный триплетный класс — мне кататься самостоятельно?

Я хочу использовать триплетный класс, максимально похожий на std :: pair. STL, похоже, не имеет. Я не хочу использовать что-то слишком тяжелое, например, Boost. Есть ли какой-нибудь полезный триплет-класс FOSS с неограниченной лицензией, который я мог бы откуда-то поднять? Должен ли я свернуть свой собственный? Должен ли я сделать что-то еще полностью?

Редактировать: Около std::tuple

Неужели нет никакой пользы для триплетного класса? Я имею в виду, с кортежем, я не могу сделать

template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;

теперь я могу? Должен ли я печатать тройки отдельных типов?

21

Решение

Нет, не катай свои собственные. Вместо этого взгляните на std::tuple — это обобщение std::pair, Так вот трижды инициализированная значение ints:

std::tuple<int, int, int> triple;

Если вы хотите, вы можете использовать псевдоним типа только для троек:

template<typename T1, typename T2, typename T3>
using triple = std::tuple<T1, T2, T3>;
31

Другие решения

Если вы можете использовать C ++ 11, используйте std :: tuple

Если нет, используйте boost :: tuple

6

Если вы используете C ++ 11, вы можете использовать std::tuple.

Если вы используете C ++ 03, то вам нужно будет либо прибегнуть к собственным (что не так уж сложно), либо использовать tuple от Boost.

5

Я думаю, что вам нужно что-то вроде этого:

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

Чтобы добавить аспект сходства с std :: pair, вы можете определить класс, у которого есть первый, второй и третий. Я предполагаю, что в этом случае вы не можете избежать создания подкласса std :: pair и добавить «третий» член. Это несколько строк кода.

Кроме того, если вы часто используете эти вещи с одним и тем же типом, вы также можете создавать классы-близнецы и триплеты. Легко делается с использованием C ++ — 11, например:

template <typename T> using twins = std::pair<T,T>;
-1
По вопросам рекламы [email protected]