2015-07-26 3 views
3

Я думаю, что фрагмент кода сам по себе является пояснительным, но в основном функция шаблона ExecFunc должна иметь возможность выполнять другую функцию и возвращать ее результат. Я знаю, что могу достичь аналогичных результатов, используя decltype вместо result_of, но этот вопрос должен понять , почему то, что я написал, не работает: фрагмент не компилируется на gcc v4.9.2.using std :: result_of, чтобы определить тип возвращаемого аргумента шаблона

Это то, что у меня есть:

#include <type_traits> 

int f(int i) 
{ 
    return i; 
} 

template<class F, class T> 
auto ExecFunc(F f, T arg) -> typename std::result_of<F()>::type 
{ 
    return f(arg); 
} 

int main() { 
    auto a = ExecFunc(f, 3); 
    return 0; 
} 

и это вывод компилятора:

prova.cpp: In function ‘int main()’: 
prova.cpp:15:26: error: no matching function for call to ‘ExecFunc(int (&)(int), int)’ 
auto a = ExecFunc(f, 3); 
        ^
prova.cpp:15:26: note: candidate is: 
prova.cpp:9:6: note: template<class F, class T> typename std::result_of<F()>::type ExecFunc(F, T) 
auto ExecFunc(F f, T arg) -> typename std::result_of<F()>::type 
    ^
prova.cpp:9:6: note: template argument deduction/substitution failed: 
prova.cpp: In substitution of ‘template<class F, class T> typename std::result_of<F()>::type ExecFunc(F, T) [with F = int (*)(int); T = int]’: 
prova.cpp:15:26: required from here 
prova.cpp:9:6: error: no type named ‘type’ in ‘class std::result_of<int (*())(int)>’ 

нотабене этот вопрос может выглядеть как дубликат this one, но принятое решение для меня не работает (по крайней мере, насколько я могу судить, я включил решение в свой код).

ответ

4

У вас есть функция int f(int i), но вы вызываете F(), что неизвестно. std::result_of<F()>::type должно быть std::result_of<F(T)>::type.

Live Example

+0

вы предлагаете мне позвонить 'зЬй :: result_of '? это тоже не работает, и в конце концов вы должны передать тип в качестве аргумента шаблона, а не выражение – blue

+0

@blue. Я допустил ошибку. Теперь это исправлено. – NathanOliver

+0

спасибо, вопрос о последующих действиях, если вы не возражаете: какой бы правильный синтаксис, если в качестве возвращаемого типа 'ExecFunc' мне нужна' std :: queue > '? p.s. Я приму этот ответ, поскольку он был первым и самым полным. – blue

2

Проблема с параметром result_of, он должен быть:

-> typename std::result_of<F(T)>::type 
+0

Результат:' F' в любом случае, нет? –

+1

@LightnessRacesinOrbit huh? Почему это будет 'F'? Это примерно 'std :: declval () (std :: declval ())', который не будет 'F' (в стороне: было бы непросто для этого быть' F') и совершенно отличный от 'std :: declval ()()'. – Yakk

+0

@Yakk хорошо аргументирован –

0

Это идеальное время, чтобы использовать decltype

template<class F, class T> 
auto ExecFunc(F f, T arg) -> decltype(f(arg)) 
Смежные вопросы