Здравствуйте, sanx, Вы писали:
S>Например есть:
S>typedef std::pair<int32, std::string> MyID;
S>1) Возможно ли как-то иметь доступ к std::pair.first/second по псевдониму:
S>- без #define
S>- без "оверхеда"
S>- если first/second поменяю местами (возможно это много хочу)
S>?
S>Например:
S>MyID id;
S>Далее используем id.num и id.name
Если у id тип именно std::pair — то нельзя.
Возможно точка непринципиальна — тогда можно использовать
внешнюю функцию/оператор:
{
MyID p{42, 0.5};
cout << (p,num) << endl;
cout << p%num << endl;
cout << numf(p) << endl;
}
Кстати были рассуждения о том чтобы позволить вызывать внешние функции через точку, в том числе
у Страуструпа — тогда можно было бы
p.numf()
S>2) А для доступа к std::tuple
S>3) А имеет ли это смысл или лучше просто POD использовать?
Что лучше зависит от полного условия задачи — тебе вообще для чего нужны pair/tuple? А доступ по именам?
Возможно подойдёт BOOST_FUSION/HANA_DEFINE_STRUCT, или например
magic_get.
Здравствуйте, sanx, Вы писали:
S>Например есть:
S>typedef std::pair<int32, std::string> MyID;
S>1) Возможно ли как-то иметь доступ к std::pair.first/second по псевдониму:
S>- без #define
S>- без "оверхеда"
S>- если first/second поменяю местами (возможно это много хочу)
S>?
S>Например:
S>MyID id;
S>Далее используем id.num и id.name
Глобальные константы — указатели на член класса?
typedef std::pair<int, std::string> MyID;
const auto num= & MyID::first;
const auto name= & MyID::second;
std::cout<< id.*num <<std::endl;
std::cout<< id.*name <<std::endl;
Формально, есть оверхед: переменная размером в указатель, на каждую единицу трансляции, но должно соптимизироваться...
Только вот введение настолько широко-употребительных имен в глобальный контекст — нехорошо.
S>2) А для доступа к std::tuple
S>3) А имеет ли это смысл или лучше просто POD использовать?
typedef std::tuple<int, std::string> MyID;
enum { num=0, name=1 };
std::cout<< std::get<num>(id) <<std::endl;
std::cout<< std::get<name>(id) <<std::endl;
или, для C++14:
typedef std::tuple<int, std::string> MyID;
typedef int num;
typedef std::string name;
std::cout<< std::get<num>(id) <<std::endl;
std::cout<< std::get<name>(id) <<std::endl;