Как использовать std::result_of, когда возвращаемое значение является типом шаблона?
Я пытаюсь использовать result_of для случая, когда Callable возвращает тип шаблона и получить следующую ошибку (clang++). Я также включил простой случай, когда все работает отлично.
Ошибка:
main.cpp:22:50: note: candidate template ignored: could not match '<type-parameter-0-1>' against 'std::__1::shared_ptr<int> (*)()'
typename std::result_of<FunctionType<T>()>::type submit(FunctionType<T> f) {
Код:
int f() {
int x = 1;
return x;
}
template<typename T>
std::shared_ptr<T> g() {
std::shared_ptr<T> x;
return x;
}
template <template<typename> class FunctionType, typename T>
typename std::result_of<FunctionType<T>()>::type submit(FunctionType<T> f) {
using result_type = typename std::result_of<FunctionType<T>()>::type;
result_type x;
return x;
}
template<typename FunctionType>
typename std::result_of<FunctionType()>::type submit2(FunctionType f) {
using result_type = typename std::result_of<FunctionType()>::type;
result_type x;
return x;
}
int main()
{
submit(g<int>); // error
submit2(f); // ok
return 0;
}
1 ответ
Решение
g<int>
имеет тип shared_ptr<int>()
который при выводе из функции распадается на указатель на этот тип (shared_ptr<int>(*)()
). FunctionType
в submit
поэтому не является шаблоном, и вы не можете использовать аргументы шаблона для него.
Если бы вы могли лучше понять, что вы пытаетесь сделать, мы можем найти решение вашей основной проблемы.