2016-04-27 9 views
1

В C++ мы имеем operator::, что позволяет нам делать такие вещи, что:Scope разрешение оператора на объекте

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

+0

Вы * попробуйте * его? – WhozCraig

+0

@WhozCraig Я отредактировал свой вопрос, чтобы объяснить, о чем вы спрашиваете. – LibertyPaul

+0

Вы имеете в виду что-то вроде 'decltype (p2.first) a2 (42);'? – WhozCraig

ответ

1

Получение типа переменной в точности соответствует ключевому слову decltype в C++ 11.

decltype(p2.first) a2 = 42; 

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

1

Если вы используете GCC, существует эквивалент pre-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; 
} 

Example here.

В качестве альтернативы, если вы можете использовать boost, он обеспечивает Boost.typeof, которые должны работать в более старых компиляторов Visual C++, а также.

+0

Это хорошая идея, но на самом деле это более подробно, чем просто вводя' pairAB :: first_type' – Sean

+0

@Sean да, это более подробно; но я предполагаю, что у плаката была причина, по которой он хотел этого не писать. – mindriot

-1

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

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

+0

TY, я знаю о преимуществах typedefs. Как вы можете видеть, я использовал их в примере. Мой вопрос не в том, «Как мне это сделать?", но о" Как использовать переменную как typename (или namespace resolver)? " – LibertyPaul

 Смежные вопросы

  • Нет связанных вопросов^_^