0

Я учусь, как получить type возвращаемого значения из перегруженной функции test() против test(double).Тип типа «тип» в «std :: result_of»; получить тип возвращаемого значения от перегрузки функций

Я изменил код из a SO answer (by chris).

#include <type_traits> 
#include <utility> 

int test(); 
double test(double x); 

template<typename... Ts> 
using TestType = decltype(test(std::declval<Ts>()...))(Ts...); 

int main() { 
    std::result_of< TestType<double> >::type n = 0; 
    //^ ### compile error ### 
    using doubleDat = std::result_of< TestType<double> >::type ; 
    doubleDat n=0; 
} 

У меня ошибка компиляции.

error: no type named 'type' in 'std::result_of'

Как я понимаю: -

  • TestType<...> является "VARIADIC шаблон".
    Своими словами он действует как упакованный аббревиатурой, который имеет любое количество параметров.

  • TestType<double> является идентификатор функции test(double).

  • std::result_of<TestType<double>>::type является тип возвращаемого test(double).
    doubleDat должно быть double.

Вопрос: Почему это не компилируется? Как его решить?

Я прочитал эти: -

Clue: После долгих поисков, я получить слабый запах, который мой код страдает «Самый неприятный синтаксический разбор».

ответ

4

Посмотрите на то, что ваш TestType<double> расширяется:

test(std::declval<double>())(double) 

test(std::decvlal<double>) является double так что вы получите double(double)

result_of<double(double)>::type спрашивает, если вы можете вызвать double с аргументом типа double.

Ответ: нет, потому что double не отозвана, так что нет вложенного типа.

Вы должны прочитать документацию для result_of, чтобы понять, как использовать его. Тип result_of<F(Arg)>::type является результатом вызова F с аргументом Arg. Если F является вызываемым с аргументом Arg вы получите тип возвращаемого значения, если это не вызываемое с аргументом Arg то вложенная type не существует.

Так что это будет работать:

using func_type = TestType<double>; 
using doubleDat = std::result_of<func_type*(double)>::type; 

Это создает псевдоним для функции типа TestType<double> (т.е. double(double)), а затем спрашивает, если вы можете вызвать указатель на этот тип (т.е. double(*)(double)) с аргументом type double. И вы можете, поэтому вы допустили type.

+0

Я уже собирался написать свой собственный ответ после экспериментов. Ты подтолкнул меня на это. –

+0

Я хочу быть хорошим в этих вещах. (Я медленно обучаюсь на основе проб и ошибок). Как получить богатые знания в этой области в одном большом куске? Есть ли какая-нибудь книга, например. который в [книге C++ book SO link] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), подробно освещая эти темы? учебное видео? Вы пишете несколько книг на C++? – javaLover

+3

[Научите себя C++ за 21 день] (http://abstrusegoose.com/249) –