我正在调用一个基于模板的函数,它在函数和结构之间共享一个类型。这段代码有什么问题?为什么编译时会收到错误?
TEST.CPP
#include <functional>
#include <iostream>
template<typename T>
struct mystruct
{
T variable;
};
int myfunc(int x)
{
return 2*x;
}
template<typename T>
T calculate(
mystruct<T> custom_struct,
std::function<T(T)> custom_func)
{
return custom_func(custom_struct.variable);
}
int main()
{
mystruct<int> A;
A.variable=6;
std::cout<<calculate(A,myfunc)<<std::endl;
return 0;
}
编译器结果:
test.cpp:25:31: error: no matching function for call to ‘calculate(mystruct<int>&, int (&)(int))’
std::cout<<calculate(A,myfunc)<<std::endl;
^
答案 0 :(得分:3)
你的代码有点混乱,但总是一个解决方案。
#include <functional>
#include <iostream>
template<typename T>
struct mystruct
{
T variable;
};
const int myfunc(const int & x)
{
return 2*x;
}
template<typename T>
T calculate(
mystruct<T> custom_struct,
std::function<T(T)> custom_func)
{
return custom_func(custom_struct.variable);
}
int main()
{
mystruct<int> A;
A.variable=6;
std::cout<<calculate<int>(A,myfunc)<<std::endl;
return 0;
}
return custom_func(custom_struct)
只出现问题,您必须从该结构中传递variable
成员并添加calculate<int>
而不是calculate
。
您可以在此处尝试/测试新代码:http://cpp.sh/33cpn
答案 1 :(得分:2)
template<typename T>
int calculate(
mystruct<T> custom_struct,
std::function<T(T)> custom_func);
编译器将尝试从T
以及std::function<T(T)>
推导出mystruct<T>
,但从函数指针中扣除失败。一种解决方案是在std::function<T(T)>
上禁用模板推导,使其成为非推导的上下文:
template <typename T> struct identity { using type = T; };
template <typename T> using identity_t = typename identity<T>::type;
template<typename T>
int calculate(
mystruct<T> custom_struct,
identity_t<std::function<T(T)>> custom_func)
{
return custom_func(custom_struct.variable);
}
尽管它使函数签名更加丑陋,但您仍然可以推导T
,因此您只需拨打calculate(A,myfunc)
而不是calculate<int>(A,myfunc)
。
但是,在这种情况下,您应该使用TemplateRex's solution,因为std::function
附带了一堆您实际上并不需要的开销,除非您想要将其存储在某处。