2016-11-09 4 views
0

Как можно вывести тип выражения аргумента шаблона? Например, в отношении следующий код:Вывод выражения типа шаблона

template< typename T > 
class A 
{ 
//.... 
}; 

template< typename T_1, typename T_2 > 
class B 
{ 
    auto foo() 
    { 
    return A</* Type of "T_1+T_2"*/>(); 
    } 
}; 

Как тип T_1+T_2 быть выведен? Например, это может быть T_1=float и T_2=int, и, следовательно, foo должен вернуть A<float>() (так как суммирование a integer с float приводит к float).

ответ

3

Вы можете использовать комбинацию из decltype и std::declval. Я также предложил бы набрать тип результата для лучшей удобочитаемости:

template< typename T_1, typename T_2 > 
class B 
{ 
    typedef decltype(std::declval<T_1>() + std::declval<T_2>()) result_type; 
    auto foo() -> result_type 
    { 
    return A<result_type>(); 
    } 
}; 
2

Вы можете использовать decltype с std::declval:

return A<decltype(std::declval<T_1>() + std::declval<T_2>())>(); 

decltype дает тип выражения. std::declval создает ссылку на тип из ниоткуда для использования в выражениях decltype.

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