Каковы хорошие варианты использования кортежей в С++ 11? Например, у меня есть функция, которая определяет локальную структуру следующим образом:
template<typename T, typename CmpF, typename LessF>
void mwquicksort(T *pT, int nitem, const int M, CmpF cmp, LessF less)
{
struct SI
{
int l, r, w;
SI() {}
SI(int _l, int _r, int _w) : l(_l), r(_r), w(_w) {}
} stack[40];
// etc
Я рассматривал возможность замены структуры SI
на std::tuple<int,int,int>
, которая является гораздо более коротким объявлением с удобными конструкторами и операторами, уже предопределенными, но со следующими недостатками:
- Элементы Tuple скрыты в неясных, определенных реализацией структурах. Несмотря на то, что Visual Studio интерпретирует и показывает их содержимое красиво, я все еще не могу установить условные точки останова, которые зависят от значения элементов кортежа.
- Доступ к отдельным полям кортежа (
get<0>(some_tuple)
) гораздо более подробный, чем доступ к элементам структуры (s.l
). - Доступ к полям по имени гораздо более информативен (и короче!), чем числовым индексом.
Последние две точки несколько рассматриваются функцией tie
. Учитывая эти недостатки, что будет хорошим вариантом использования для кортежей?
ОБНОВЛЕНИЕ. Оказывается, что отладчик VS2010 SP1 не может отображать содержимое следующего массива std::tuple<int, int, int> stack[40]
, но он отлично работает, когда он кодируется с помощью структуры. Таким образом, решение в основном не вызывает затруднений: если вам когда-либо придется проверять свои значения, используйте struct [esp. важно с такими отладчиками, как GDB].