2016-05-23 2 views

ответ

38

Конечно, использовать decltype:

auto var_a = bar(t); 
decltype(var_a) b; 

Вы можете добавить CV-определители и ссылки на decltype спецификаторов, как будто это любой другой тип:

const decltype(var_a)* b; 
+0

может быть стоит упомянуть, что decltype() дает вам тип * exact *. В этом примере, если var_a является ссылкой, b не будет по умолчанию конструктивным и не удастся для компиляции. Очевидно, что это может иметь место и для любого определенного пользователем типа. – Arvid

+4

Вы можете обойти ссылочную проблему с помощью ['std :: remove_reference'] (http://en.cppreference.com/w/cpp/types/remove_reference): 'std :: remove_reference :: type b; ' – Mego

18
decltype(var_a) var_b; 

И Lorem Ipsum для достижения требуемого минимума 30 символов в ответ.

+8

Lorem Ipsum продал меня. – KyleKnoepfel

+8

Если ваш ответ только для кода и так мало, что вам нужно добавить к нему бессмыслицу, спросите себя, является ли это хорошим (хорошим! = Полезным) ответом или нет. Рассмотрим, например, ссылку на [документацию] (http://en.cppreference.com/w/cpp/language/decltype). – Tas

+1

@Tas Вы, кажется, придерживаетесь мнения, что этот ответ не поможет. Почему нет? – immibis

11

Несмотря на хороший ответ на @TartanLlama, это другой способ, которым можно использовать decltype, чтобы назвать фактически данный тип:

int f() { return 42; } 

void g() { 
    // Give the type a name... 
    using my_type = decltype(f()); 
    // ... then use it as already showed up 
    my_type var_a = f(); 
    my_type var_b = var_a; 
    const my_type &var_c = var_b; 
} 

int main() { g(); } 

Возможно, стоит упомянуть об этом ради полноты.

Я не ищу кредиты, так как это почти то же самое из вышеупомянутого ответа, но я считаю его более читаемым.

+0

Внизу интерес интересен. Я хотел бы знать, для чего это возможно ... – skypjack

+0

Возможно, это было потому, что у вас есть лишний вызов 'f()'. Таким образом, в зависимости от характера 'f()' (длительное время вычисления, побочные эффекты и т. Д.) Это может быть очень плохо. –

+0

@ M.Herzkamp Мы говорим о времени компиляции, не так ли?В любом случае, просто любопытно, мне не нравится, кто идет, не оставляя комментариев, чтобы объяснить - это те комментарии, которые обычно помогают улучшить мои знания, вот и все. – skypjack

6

В древние времена до появления на C++ 11 люди обращались к нему с использованием чистых шаблонов.

template <class Bar> 
void foo_impl(Bar var_a) { 
    Bar var_b; //var_b is of the same type as var_a 
} 

template <class T> 
void foo(T t) { 
    foo_impl(bar(t)); 
} 


F_1 bar(T_1 t) { 

} 

F_2 bar(T_2 t) { 

} 
+0

И нижний нисходящий для ...? –

+0

Это был не мой голос, но я предполагаю, что опубликую ответ, который больше не имеет отношения к C++ 11 и новее к вопросу, который был помечен C++ 11. – hvd

+4

@hvd, насколько я знаю, шаблоны все еще существуют в C++ 11 ... –

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