gpt4 book ai didi

c++ - 如何创建一个仿函数作为 2 个仿函数的总和?

转载 作者:搜寻专家 更新时间:2023-10-31 02:12:46 25 4
gpt4 key购买 nike

假设我有 2 个仿函数 add 和 mult。 add2(x) = x+2mult3(x) = 3x。我想创建一个组合张量 t 使得 t(x) = x+2 + 3x。我提出了创建一个 仿函数的解决方案,但我并不十分满意,因为该解决方案无法扩展到更多数量的仿函数。我有哪些选择?

struct add {
private:
double c_;
public:
add(double& c): c_(c) {}
double operator()(double& x) {
return c_ + x;
}
};

struct mult {
private:
double c_;
public:
mult(double& c): c_(c) {}
double operator()(double& x) {
return c_ * x;
}
}

template<typename T1, typename T2>
struct pair {
private:
T1 t1_;
T2 t2_;
public:
pair(T1 t1, T2 t2): t1_(t1), t2_(t2) {}
double operator()(double& x) {
return t1_(x) + t2_(x);
}
}

add add2 = add(2);
mult mult3 = mult(3);
pair combined = pair(add2, mult3);

最佳答案

名称 pair 并没有真正说明仿函数的作用。我认为按照以下思路创建一些东西是有意义的:

template<typename T1, typename T2>
struct plus
{
plus(T1 t1, T2 t2) : t1_(t1), t2_(t2) {}
double operator()(double x)
{
return t1_(x) + t2_(x);
}
T1 t1_;
T2 t2_;
};

并提供一个辅助函数来创建这种类型的实例。

template<typename T1, typename T2>
plus<T1, T2> make_plus(T1 t1, T2 t2)
{
return plus<T1, T2>(t1, t2);
}

然后,您可以使用:

add add2 = add(2);
mult mult3 = mult(3);
auto comb1 = make_plus(add2, mult3);
auto comb2 = make_plus(mult(10), make_plus(add2, mult3));

这是一个添加了一个减号的程序。

#include <iostream>

struct add
{
add(double c): c_(c) {}
double operator()(double x) {
return c_ + x;
}
double c_;
};

struct mult
{
mult(double c): c_(c) {}
double operator()(double x) {
return c_ * x;
}
double c_;
};

template<typename T1, typename T2>
struct plus
{
plus(T1 t1, T2 t2) : t1_(t1), t2_(t2) {}
double operator()(double x)
{
return t1_(x) + t2_(x);
}
T1 t1_;
T2 t2_;
};

template<typename T1, typename T2>
plus<T1, T2> make_plus(T1 t1, T2 t2)
{
return plus<T1, T2>(t1, t2);
}

template<typename T1, typename T2>
struct minus
{
minus(T1 t1, T2 t2) : t1_(t1), t2_(t2) {}
double operator()(double x)
{
return t1_(x) - t2_(x);
}
T1 t1_;
T2 t2_;
};

template<typename T1, typename T2>
minus<T1, T2> make_minus(T1 t1, T2 t2)
{
return minus<T1, T2>(t1, t2);
}


int main()
{
add add2 = add(2);
mult mult3 = mult(3);
auto comb1 = make_plus(add2, mult3);
auto comb2 = make_plus(mult(10), make_plus(add2, mult3));
auto comb3 = make_minus(mult(10), make_plus(add2, mult3));

std::cout << comb1(10) << std::endl;
std::cout << comb2(10) << std::endl;
std::cout << comb3(10) << std::endl;
}

输出:

42
142
58

另一种选择是在特定应用程序中创建类型 addmultplusminus命名空间,然后添加 operator+operator- 重载,使 main 中的代码更加直观。

#include <iostream>

namespace myapp
{
struct identity
{
double operator()(double x) { return x;}
};

struct add
{
add(double c): c_(c) {}
double operator()(double x) {
return c_ + x;
}
double c_;
};

struct mult
{
mult(double c): c_(c) {}
double operator()(double x) {
return c_ * x;
}
double c_;
};

template<typename T1, typename T2>
struct plus
{
plus(T1 t1, T2 t2) : t1_(t1), t2_(t2) {}
double operator()(double x)
{
return t1_(x) + t2_(x);
}
T1 t1_;
T2 t2_;
};

template<typename T1, typename T2>
plus<T1, T2> make_plus(T1 t1, T2 t2)
{
return plus<T1, T2>(t1, t2);
}

template<typename T1, typename T2>
plus<T1, T2> operator+(T1 t1, T2 t2)
{
return make_plus(t1, t2);
}

template<typename T1, typename T2>
struct minus
{
minus(T1 t1, T2 t2) : t1_(t1), t2_(t2) {}
double operator()(double x)
{
return t1_(x) - t2_(x);
}
T1 t1_;
T2 t2_;
};

template<typename T1, typename T2>
minus<T1, T2> make_minus(T1 t1, T2 t2)
{
return minus<T1, T2>(t1, t2);
}

template<typename T1, typename T2>
minus<T1, T2> operator-(T1 t1, T2 t2)
{
return make_minus(t1, t2);
}
}

int main()
{
using namespace myapp;
add add2 = add(2);
mult mult3 = mult(3);

auto comb1 = add2 + mult3;
auto comb2 = mult(10) + add2 + mult3;
auto comb3 = mult(10) - (add2 + mult3);
auto comb4 = identity{} + add(25);

std::cout << comb1(10) << std::endl;
std::cout << comb2(10) << std::endl;
std::cout << comb3(10) << std::endl;
std::cout << comb4(10) << std::endl;
}

关于c++ - 如何创建一个仿函数作为 2 个仿函数的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42311712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com