Подтвердить что ты не робот

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

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

Изменить: О std::tuple...

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

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

Теперь я могу? Разве мне не придется вводить типефические тройки с индивидуальным типом?

4b9b3361

Ответ 1

Взгляните на 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>;

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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;

Ответ 5

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

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

template <typename T> using twins = std::pair<T,T>;