станд.:: кортеж получает () функцию членства

boost::tuple имеет a get() функция членства используется как это:

tuple<int, string, string> t(5, "foo", "bar");
cout << t.get<1>();  // outputs "foo"

Это кажется C++ 0x std::tuple не имеет этой функции членства, и необходимо вместо этого использовать не являющуюся членом функциональную форму:

std::get<1>(t);

чтобы мне выглядит более ужасным.

Есть ли какая-то конкретная причина почему std::tuple разве функция членства не имеет? Или это - просто моя реализация (GCC 4.4)?

49
задан Lii 3 February 2016 в 04:45
поделиться

2 ответа

Из проекта C++0x:

[ Примечание: Причина, по которой get является функцией, не являющейся членом, заключается в том, что если бы эта функциональность была предоставлена как функция-член, код, в котором тип зависит от параметра шаблона, требовал бы использования ключевого слова template. - end note ]

Это можно проиллюстрировать следующим кодом:

template <typename T>
struct test
{
  T value;
  template <int ignored>
  T&  member_get ()
  {  return value;  }
};

template <int ignored, typename T>
T&  free_get (test <T>& x)
{  return x.value;  }

template <typename T>
void
bar ()
{
  test <T>  x;
  x.template member_get <0> ();  // template is required here
  free_get <0> (x);
};
63
ответ дан 7 November 2019 в 11:34
поделиться

N3090/3092, §20.4.2.6/8: "Примечание: Причина, по которой функция get является нечленом, заключается в том, что если бы эта функциональность была предоставлена как функция-член, код, где тип зависит от параметра шаблона, требовал бы использования ключевого слова template. -end note"

12
ответ дан 7 November 2019 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: