Я думаю, что фрагмент кода сам по себе является пояснительным, но в основном функция шаблона 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, но принятое решение для меня не работает (по крайней мере, насколько я могу судить, я включил решение в свой код).
вы предлагаете мне позвонить 'зЬй :: result_of '? это тоже не работает, и в конце концов вы должны передать тип в качестве аргумента шаблона, а не выражение –
blue
@blue. Я допустил ошибку. Теперь это исправлено. – NathanOliver
спасибо, вопрос о последующих действиях, если вы не возражаете: какой бы правильный синтаксис, если в качестве возвращаемого типа 'ExecFunc' мне нужна' std :: queue> '? p.s. Я приму этот ответ, поскольку он был первым и самым полным. –
blue