В C ++ у нас есть operator::
, что позволяет нам делать такие вещи:
typedef std::pair<A, B> pairAB;
pairAB p;
pairAB::first_type a(42);
pairAB::second_type b("hello world");
p.first = a;
p.second = b;
Я пытался использовать этот оператор на объекте этого типа:
pairAB p2;
p2::first_type a2(42);
p2::second_type b2("hello again");
p2.first = a2;
p2.second = b2;
И компилятор показал мне error: C2510: 'p2' : left of '::' must be a class/struct/union
и я хочу знать, есть ли какой-нибудь трюк, который позволяет мне это сделать?
Получение типа переменной это именно то, что decltype
Ключевое слово для в C ++ 11.
decltype(p2.first) a2 = 42;
До c ++ 11 не было стандартного способа сделать это. Есть специфические особенности компилятора, такие как gcc typeof
и основанные на библиотеках реализации, такие как Boost.Typeof, которые существовали до c ++ 11 и делают аналогичные вещи.
Если вы используете GCC, существует эквивалент до C ++ 11, называемый __typeof__
который ведет себя аналогично. Пытаться:
#include <string>
int main()
{
typedef std::pair<int, std::string> pairAB;
pairAB p2;
__typeof__(p2.first) a2 = 42;
__typeof__(p2.second) b2 = "hello again";
p2.first = a2;
p2.second = b2;
}
В качестве альтернативы, если вы можете использовать увеличение, это обеспечивает Boost.typeof который должен работать и в старых компиляторах Visual C ++.
Нет необходимости ни в возможностях C ++ 11, ни в расширениях компилятора, таких как typeof
в C ++ 03, которые не являются переносимыми. Если переменная используется, ее тип где-то доступен — скажем, это T в шаблоне или сигнатуре функции.
Тогда вы можете просто typename T::first_type
поскольку pair
несет информацию о типах членов для своих типов членов (как и многие другие классы STL, такие как контейнеры, string
…)