当 return 值是模板类型时如何使用 std::result_of?
How to use std::result_of when return value is a template type?
我正在尝试将 result_of 用于 Callable returns 模板类型的情况,并收到以下错误 (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;
}
g<int>
属于 shared_ptr<int>()
类型,当由函数推导时,它会衰减为指向该类型的指针 (shared_ptr<int>(*)()
)。 submit
中的 FunctionType
因此 不是 模板,您不能在其上使用模板参数。
如果您能更清楚地了解您正在尝试做什么,我们可以找到解决您的主要问题的方法。
我正在尝试将 result_of 用于 Callable returns 模板类型的情况,并收到以下错误 (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;
}
g<int>
属于 shared_ptr<int>()
类型,当由函数推导时,它会衰减为指向该类型的指针 (shared_ptr<int>(*)()
)。 submit
中的 FunctionType
因此 不是 模板,您不能在其上使用模板参数。
如果您能更清楚地了解您正在尝试做什么,我们可以找到解决您的主要问题的方法。