Оператор разрешения области на объекте

В 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и я хочу знать, есть ли какой-нибудь трюк, который позволяет мне это сделать?

1

Решение

Получение типа переменной это именно то, что decltype Ключевое слово для в C ++ 11.

decltype(p2.first) a2 = 42;

До c ++ 11 не было стандартного способа сделать это. Есть специфические особенности компилятора, такие как gcc typeof и основанные на библиотеках реализации, такие как Boost.Typeof, которые существовали до c ++ 11 и делают аналогичные вещи.

1

Другие решения

Если вы используете 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 ++.

1

Нет необходимости ни в возможностях C ++ 11, ни в расширениях компилятора, таких как typeof в C ++ 03, которые не являются переносимыми. Если переменная используется, ее тип где-то доступен — скажем, это T в шаблоне или сигнатуре функции.

Тогда вы можете просто typename T::first_type поскольку pair несет информацию о типах членов для своих типов членов (как и многие другие классы STL, такие как контейнеры, string…)

-1
По вопросам рекламы [email protected]