Каковы хорошие варианты использования кортежей в С++ 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].