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

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

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

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

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

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

6 ответов

Решение

Нет, не катай свои собственные. Вместо этого взгляните на 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<T1, T2>, T3>

Это особенно хорошо подходит, если тройка на самом деле состоит из двух подэлементов, которые естественным образом можно рассматривать как пары.

Это было предложено в Paweł Stawarz ли C++« тройной »шаблон, сравнимый с парой &amp;lt;T1, T2&amp;gt;?и Frédéric Hamidi в комментариях к исходному вопросу. Пожалуйста, проголосуйте за их ответы, если вы сочтете это полезным.

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

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

template <typename T> using twins = std::pair<T,T>;
Другие вопросы по тегам