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)?
Из проекта 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);
};
N3090/3092, §20.4.2.6/8: "Примечание: Причина, по которой функция get является нечленом, заключается в том, что если бы эта функциональность была предоставлена как функция-член, код, где тип зависит от параметра шаблона, требовал бы использования ключевого слова template. -end note"