alias для std::pair.first/second, может даже для std::tuple
От: sanx  
Дата: 05.02.17 22:08
Оценка:
Например есть:
typedef std::pair<int32, std::string> MyID;

1) Возможно ли как-то иметь доступ к std::pair.first/second по псевдониму:
— без #define
— без "оверхеда"
— если first/second поменяю местами (возможно это много хочу)
?
Например:
MyID id;
Далее используем id.num и id.name

2) А для доступа к std::tuple
3) А имеет ли это смысл или лучше просто POD использовать?
std::pair std::tuple pod
Re: alias для std::pair.first/second, может даже для std::tuple
От: Evgeny.Panasyuk Россия  
Дата: 06.02.17 03:41
Оценка:
Здравствуйте, 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.
Re: alias для std::pair.first/second, может даже для std::tuple
От: Chorkov Россия  
Дата: 06.02.17 07:40
Оценка:
Здравствуйте, 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;
Re: alias для std::pair.first/second, может даже для std::tuple
От: rg45 СССР  
Дата: 06.02.17 09:16
Оценка:
Здравствуйте, sanx, Вы писали:

S>1) Возможно ли как-то иметь доступ к std::pair.first/second по псевдониму:

S>- без #define
S>- без "оверхеда"
S>- если first/second поменяю местами (возможно это много хочу)

Практически равноценного эффекта можно добиться использованием свободных функций. Можно твердо рассчитывать на встраивание и не опасаться овержеда.

S>3) А имеет ли это смысл или лучше просто POD использовать?


Это уже зависит от решаемой задачи. Следует учитывать, что и std::pair, и std::tuple имеют набор полезных утилит, таких как операторы сравнения, swap и др.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.