将函数传递给函数模板时出错

时间:2019-07-12 21:34:54

标签: c++ c++11

我有功能模板:

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)?

2 个答案:

答案 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;
}