STL-подобный триплетный класс - я рулон свой?
Я хочу использовать триплетный класс, как можно более похожий на std:: pair. У STL, похоже, нет такого. Я не хочу использовать что-то слишком тяжелое, как Boost. Есть ли какой-нибудь полезный класс триплетной лицензии FOSS, который я могу поднять откуда-нибудь? Должен ли я катиться самостоятельно? Должен ли я вообще что-то делать?
Изменить: О std::tuple
...
Действительно ли нет преимущества для триплетного класса? Я имею в виду, с кортежем, я не могу сделать
template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
Теперь я могу? Разве мне не придется вводить типефические тройки с индивидуальным типом?
Ответы
Ответ 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>;