我有功能模板:
template<typename T>
inline T fun3(T &x1, T &x2)
{
return std::pow(x1,2.0) + std::pow(x2,2.0);
}
template<typename T, typename U>
inline T fun5(U &a)
{
return (T(4.0+a*(-2.0),5.0+ a*3.0));
}
template<typename F, typename T>
void min(F fun1, T& v)
{
double x={10.0};
v=fun1(x);
}
int main()
{
double val;
min(fun3(fun5),val);
std::cout<<"value = "<<val<<"\n";
return 0;
}
我想评估fun3(fun5(x))
并具有如上所述的功能。但是错误为no matching function for call to ‘Function5<double>::fun5(<unresolved overloaded function type>)’ obj1(o5.fun5(o3.fun3),-2.0,0.0,location,value);
有人可以解释如何将功能传递给min()
吗?
如果所有这些功能都是类模板,将会发生什么变化
template<typename T>
class Fun3 {
inline T fun3(T &x1, T &x2)
{
return std::pow(x1,2.0) + std::pow(x2,2.0);
}
};
template<typename T, typename U>
class Fun5 {
inline T fun5(U &a)
{
return (T(4.0+a*(-2.0),5.0+ a*3.0));
}
};
template<typename F, typename T>
class Min {
void min(F fun1, T& v)
{
double x={10.0};
v=fun1(x);
}
};
int main()
{
double val;
Fun5<double> o5;
Fun3<decltype (o5.fun5)> o3;
Min<???,decltype (o5.fun5)> obj; //What is here?
obj(o3.fun3(o5.fun5),val);
std::cout<<"value = "<<val<<"\n";
return 0;
}
我不知道会在注释行中显示什么。 在这里如何使用函数对象(functor)?
答案 0 :(得分:0)
我想评估fun3(fun5(x))
min([](auto x){ return fun3(fun5(x)); }, val);
C ++标准库中没有函数组成(尽管可以很费力地定义它)。
答案 1 :(得分:0)
如果您真的想找乐子,请至少尝试lambda。他们很简单。 我想说的是,您要使用模板的方式要远离模板。我假设您希望简单的幸福生活专注于富有成效的事情,我可能错了。原谅。
仍然,我对您的代码进行了一些处理,并说不要混淆模板和宏。至少在我看来是这样。 请注意,模板实际上是实例化代码,为此,您只能传递任何类型的参数,并在模板实例化时指定这些类型。
这里是code sample at ideone-并不完全相同,只是为了说明如何完成工作。
For min(fun3(fun5),val);
如果您确实想要fun3行为,请通过它。不要期望结果会像对宏一样起作用。
。
#include <iostream>
#include <cmath>
using namespace std;
typedef double (*_typeofFun1)(double&);
typedef double (*_typeofFun3)(double&, double&);
template<typename T>
T fun3(T &x1, T &x2)
{
return std::pow(x1,2.0) + std::pow(x2,2.0);
}
template<typename T, typename U>
U fun5(T t, U &a)
{
//return (T(4.0+a*(-2.0),5.0+ a*3.0));
return t(a,a);
}
template <typename T>
T fun1Param(T& arg)
{
return 2*arg;
}
template<typename F, typename T>
void min(F fun1, T& v)
{
double x={10.0};
v=fun1(x);
}
int main()
{
double val = 1.0;
double d = fun5<_typeofFun3, double> (fun3, val);
fun3<double>(d, val);
min<_typeofFun1>(fun1Param,val);
std::cout<<"value = "<<val<<"\n";
return 0;
}