Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Ноябрь 01, 2015, 08:28



Название: first, second
Отправлено: Igors от Ноябрь 01, 2015, 08:28
Добрый день

std::pair скромная, но очень полезная вещь. Но вот беда - эти безликие first, second порядком затрудняют понимание написанного. Можно ли как-то использовать вместо них свои, осмысленные имена?

Спасибо


Название: Re: first, second
Отправлено: Old от Ноябрь 01, 2015, 08:34
По моему, проще сделать свою структуру.


Название: Re: first, second
Отправлено: Racheengel от Ноябрь 01, 2015, 12:25
Как бы +1


Название: Re: first, second
Отправлено: Bepec от Ноябрь 01, 2015, 14:41
Так как вы любитель странных решений, можете задефайнить first и second в что то осмысленное :D Конечно появятся более пары сотен ошибок, но вы с ними справитесь, ради своего чувства прекрасного :D


Название: Re: first, second
Отправлено: Racheengel от Ноябрь 01, 2015, 15:38
Ну еще можно отнаследоваться от пары и добавить методы с желаемыми именами для доступа к first и second... но стоит ли оно того..


Название: Re: first, second
Отправлено: Пантер от Ноябрь 02, 2015, 09:36
Структуру создай, это самое наглядное. Или tuple и enum'ом элементы обзови.


Название: Re: first, second
Отправлено: Igors от Ноябрь 02, 2015, 10:07
Структуру создай, это самое наглядное.
Ну как же я сам не сообразил? :) Только вот многовато получается таких простеньких структур, только с конструктором и оператором <

Или tuple и enum'ом элементы обзови.
А как это  ???


Название: Re: first, second
Отправлено: Пантер от Ноябрь 02, 2015, 10:09
Код
C++ (Qt)
enum {Key, Value};
 
std::tuple<std::string, std::string> keyValue_;
std::get<Key> (keyValue_);
 


Название: Re: first, second
Отправлено: m_ax от Ноябрь 02, 2015, 11:28
Цитировать
Только вот многовато получается таких простеньких структур, только с конструктором и оператором <
Макрос напишите и плодите их сколько хотите)


Название: Re: first, second
Отправлено: Igors от Ноябрь 02, 2015, 11:42
Макрос напишите и плодите их сколько хотите)
Прошу исполнить


Название: Re: first, second
Отправлено: ssoft от Ноябрь 02, 2015, 12:37
... Или tuple и enum'ом элементы обзови.

Самое корректное решение будет, к тому же легко расширяемое.



Название: Re: first, second
Отправлено: Igors от Ноябрь 02, 2015, 12:51
Самое корректное решение будет, к тому же легко расширяемое.
Хмм... ну как-то оно не производит впечатления легкости и изящества :) И оператора < что-то не видно. Но вот если эл-тов 3 и более - может тогда и тупли "попробывать"


Название: Re: first, second
Отправлено: m_ax от Ноябрь 02, 2015, 15:28
Цитировать
Прошу исполнить

Код
C++ (Qt)
#define CREATE_STRUCT(name, first, second) \
   template <class T1, class T2> \
   struct name \
   { \
       T1 first; \
       T2 second; \
        ...
   };
 
 
CREATE_STRUCT(range, min, max)
CREATE_STRUCT(point, x, y)
 


Название: Re: first, second
Отправлено: Igors от Ноябрь 02, 2015, 15:49
Код
C++ (Qt)
#define CREATE_STRUCT(name, first, second) \
   template <class T1, class T2> \
   struct name \
   { \
       T1 first; \
       T2 second; \
        ...
   };
 
 
CREATE_STRUCT(range, min, max)
CREATE_STRUCT(point, x, y)
 
К сожалению, так я теряю пусть небольшой, но приятный ф-ционал std::pair (конструктор(ы), оператор < и др). Может лучше макрос который наследует std::pair и определяет методы возвращающие ссылки? Но тогда заклинит std::make_pair...


Название: Re: first, second
Отправлено: Old от Ноябрь 02, 2015, 16:48
А в чем сложность добавить в макрос создание конструктора и нужных операторов?


Название: Re: first, second
Отправлено: m_ax от Ноябрь 02, 2015, 16:49
Цитировать
К сожалению, так я теряю пусть небольшой, но приятный ф-ционал std::pair (конструктор(ы), оператор < и др).
Ну так и определите их в макросе. В чём проблема?
Код
C++ (Qt)
#define CREATE_STRUCT(name, first, second) \
   template <class T1, class T2> \
   struct name \
   { \
       T1 first; \
       T2 second; \
        name() {} \
        name(const T1 & arg1, const T2 & arg2) : first(arg1), second(arg2) {} \
   }; \
   template <class T1, class T2> \
   bool operator<(const name<T1, T2> & p1, const name<T1, T2> & p2) {} \
 
И ещё в макрос можно засунуть специализацию make_pair, например..


Название: Re: first, second
Отправлено: Igors от Ноябрь 03, 2015, 03:36
Ну так и определите их в макросе. В чём проблема?
Такой макрос выглядит очень сомнительно. Ну ладно, нету хорошего способа - значит нету, не все должно быть как хотелось бы  :)


Название: Re: first, second
Отправлено: Old от Ноябрь 03, 2015, 07:41
Такой макрос выглядит очень сомнительно.
Вовсе нет. Добавьте туда конструктор копирования, операторы присваивания и сравнения и он будет генерировать структуру аналогичную pair.