2013-05-21 2 views
3

Очевидно, вы можете получить возвращаемый тип функции с помощью decltype (foo()), но если foo принимает аргументы, которые не будут работать, вам придется передать некоторые фиктивные аргументы в foo, чтобы он работал. Но есть ли способ получить возвращаемый тип функции без необходимости передавать ей какие-либо аргументы?Можно ли получить возвращаемый тип функции, не передавая ей аргументы?

+3

тип возвращаемого значения зависит от аргумента типа –

+0

Передайте вашу функцию в качестве аргумента в функции шаблона принимая Ret (*) (арг ...), и пусть компилятор выводит R. Он может работать только без перегрузки, очевидно. –

ответ

7

Предположив тип возвращаемого значения не зависит от типа аргумента (в этом случае вы должны использовать что-то вроде std::result_of, но вы должны предоставить тип этих аргументов), вы можете написать простой тип черта, которая позволяет вывести тип возвращаемого типа функции:

#include <type_traits> 

template<typename T> 
struct return_type; 

template<typename R, typename... Args> 
struct return_type<R(Args...)> 
{ 
    using type = R; 
}; 

int foo(double, int); 

int main() 
{ 
    using return_of_foo = return_type<decltype(foo)>::type; 
    static_assert(std::is_same<return_of_foo, int>::value, "!"); 
} 
Смежные вопросы