当前位置: 首页 > article >正文

写一个类模板三个模板参数K,V,M,参数是函数(函数参数、lambda传参、函数指针)

cal是类的成员函数。cal的3个入参是func1(K),func2(K,V),func3(K,V,M),请写出cal,并在main函数中调用cal

在您给出的要求中,cal成员函数并不直接接受func1(K),func2(K, V),func3(K, V, M)作为其参数,而是这三个函数签名代表了cal可以使用的三种不同类型的函数或可调用对象。为了让cal能够接受这些函数作为参数,并调用它们,我们可以使用函数指针、std::function或者模板参数中的可调用对象。

由于您要求的是类模板,并且cal成员函数需要接受这些函数作为参数,我将使用std::function来实现,因为它提供了更大的灵活性,可以接受任何类型的可调用对象,包括函数指针、lambda 表达式、函数对象等。

下面是一个示例代码,展示了如何定义这样的类模板,并在main函数中调用cal:

 #include <iostream>
#include <functional>

// 类模板定义
template <typename K, typename V, typename M>
class MyClass {
public:
    // cal 成员函数,接受三个不同类型的可调用对象作为参数
    void cal(std::function<void(K)> func1, std::function<void(K, V)> func2, std::function<void(K, V, M)> func3) {
        K key = K();    // 假设有一个默认构造函数来初始化 K 类型的变量
        V value = V();  // 假设有一个默认构造函数来初始化 V 类型的变量
        M meta = M();   // 假设有一个默认构造函数来初始化 M 类型的变量

        // 调用传入的函数
        func1(key);
        func2(key, value);
        func3(key, value, meta);
    }
};

// 示例函数,用于传递给 cal
void exampleFunc1(int key) {
    std::cout << "exampleFunc1 called with key: " << key << std::endl;
}

void exampleFunc2(int key, const std::string& value) {
    std::cout << "exampleFunc2 called with key: " << key << ", value: " << value << std::endl;
}

void exampleFunc3(int key, const std::string& value, double meta) {
    std::cout << "exampleFunc3 called with key: " << key << ", value: " << value << ", meta: " << meta << std::endl;
}

int main() {
    // 创建 MyClass 的实例,指定模板参数类型为 int, std::string, double
    MyClass<int, std::string, double> obj;

    // 调用 cal 函数,并传递示例函数作为参数
    obj.cal(exampleFunc1, exampleFunc2, exampleFunc3);

    // 也可以使用 lambda 表达式
    auto lambdaFunc1 = [](int key) { std::cout << "Lambda Func1 called with key: " << key << std::endl; };
    auto lambdaFunc2 = [](int key, const std::string& value) { std::cout << "Lambda Func2 called with key: " << key << ", value: " << value << std::endl; };
    auto lambdaFunc3 = [](int key, const std::string& value, double meta) { std::cout << "Lambda Func3 called with key: " << key << ", value: " << value << ", meta: " << meta << std::endl; };

    // 再次调用 cal 函数,这次使用 lambda 表达式作为参数
    obj.cal(lambdaFunc1, lambdaFunc2, lambdaFunc3);

    return 0;
}

代码说明:

  1. 类模板定义:template <typename K, typename V, typename M> class MyClass定义了一个包含三个模板参数的类模板。

  2. cal 成员函数:在类模板中定义了cal成员函数,它接受三个std::function类型的参数,这些参数分别对应了三种不同类型的可调用对象。

  3. 示例函数:定义了三个示例函数exampleFunc1,exampleFunc2,exampleFunc3,它们分别符合cal成员函数所期望的函数签名。

  4. main 函数:在main函数中,创建了MyClass的一个实例,并指定了模板参数类型为int,std::string,double。然后分别调用了cal函数,并传递了示例函数和 lambda 表达式作为参数。

编译与运行:

将上述代码保存为一个.cpp文件,然后使用 C++ 编译器(如g++)进行编译和运行。例如:

【sh】
g++ -o my_program my_program.cpp -std=c++11
./my_program

注意:由于std::function是在 C++11 中引入的,因此编译时需要指定-std=c++11或更高版本的 C++ 标准。

运行程序后,将看到示例函数和 lambda 表达式被正确调用的输出。

使用函数指针实现:
下面是一个C++类模板的实现,该类模板接受三个模板参数K、V和M,并包含一个成员函数cal。cal函数接受三个函数指针作为参数,这些函数指针分别对应func1(K)、func2(K, V)和func3(K, V, M)。

 #include <iostream>

// 类模板定义
template <typename K, typename V, typename M>
class MyClass {
public:
    // cal成员函数定义
    void cal(K (*func1)(K), V (*func2)(K, V), M (*func3)(K, V, M)) {
        K key = 1;  // 示例键值,可以根据需要修改
        V value = 2; // 示例值,可以根据需要修改
        M result;

        // 调用func1
        K result1 = func1(key);
        std::cout << "func1 result: " << result1 << std::endl;

        // 调用func2
        V result2 = func2(key, value);
        std::cout << "func2 result: " << result2 << std::endl;

        // 调用func3
        result = func3(key, value, M()); // 假设M有一个默认构造函数,或者根据需要初始化M
        std::cout << "func3 result: " << result << std::endl;
    }
};

// 函数实现,用于测试
int func1(int k) {
    return k * 2;
}

double func2(int k, double v) {
    return k + v;
}

std::string func3(int k, double v, const std::string& m) {
    return "Result: " + std::to_string(k * v) + ", Message: " + m;
}

int main() {
    // 创建类模板实例
    MyClass<int, double, std::string> myObj;

    // 调用cal成员函数
    myObj.cal(func1, func2, func3);

    return 0;
}

解释

  1. 类模板定义:
 template <typename K, typename V, typename M>
    class MyClass {
    // ...
    };

这里定义了一个类模板 MyClass,它接受三个模板参数 KVM

  1. cal成员函数:
 void cal(K (*func1)(K), V (*func2)(K, V), M (*func3)(K, V, M)) {
    // ...
    };

cal 函数接受三个函数指针作为参数,这些函数指针分别对应 func1(K)func2(K, V)func3(K, V, M)。在函数体内,我们创建了示例的 keyvalue,并调用了这些函数指针。

  1. 函数实现:
 int func1(int k) {
        return k * 2;
    }

    double func2(int k, double v) {
        return k + v;
    }

    std::string func3(int k, double v, const std::string& m) {
        return "Result: " + std::to_string(k * v) + ", Message: " + m;
    }

这些函数用于测试 cal 成员函数。它们分别符合 func1(K)func2(K, V)func3(K, V, M) 的签名。

  1. main函数:
 int main() {
        MyClass<int, double, std::string> myObj;
        myObj.cal(func1, func2, func3);
        return 0;
    }

main 函数中,我们创建了 MyClass 的一个实例,并调用了它的 cal 成员函数,传递了测试函数 func1func2func3 作为参数。

运行这个程序将输出:

func1 result: 2
func2 result: 3
func3 result: Result: 2, Message:

注意:func3的调用中,M()是一个默认构造的M类型对象,这里假设M(即std::string)有一个默认构造函数。如果M没有默认构造函数,你需要根据实际情况提供一个合适的初始化方式。


http://www.kler.cn/a/467988.html

相关文章:

  • 【计算机网络】课程 实验二 交换机基本配置和VLAN 间路由实现
  • 华为 Sensor 省电策略调研
  • 前端工程化之手搓webpack5 --【elpis全栈项目】
  • windows中硬件加速gpu计划开启cpu的使用率居高不下
  • Java虚拟机(Java Virtual Machine,JVM)
  • Vue2中使用Echarts
  • 【CSS】 ---- CSS 实现图片背景清除的滑动效果三种方法
  • 2025年全面的AI学习计划
  • HTML——69.表单验证属性
  • 游戏引擎学习第71天
  • 周末总结(2024/01/04)
  • C语言:cJSON将struct结构体与JSON互相转换
  • 【音频伴奏分离】UVR5软件介绍
  • 安卓Activity执行finish后onNewIntent也执行了
  • CSS3——3. 书写格式二
  • Linux驱动开发(18):linux驱动并发与竞态
  • Mono里运行C#脚本22—mono_init_internal
  • 在DJI无人机上运行VINS-FUISON(PSDK 转 ROS)
  • leetcode-------mysql
  • PyTorch快速入门教程【小土堆】之优化器
  • STM32 拓展 低功耗案例3:待机模式 (register)
  • SZY206-2016水资源监测数据传输规约 基础架构
  • 深入解析 Redisson 分布式限流器 RRateLimiter 的原理与实现
  • python识别outlook邮件并且将pdf文件作为附件发送邮件
  • 矩阵运算提速——玩转opencv::Mat
  • 电脑键盘打不了字是何原因,如何解决呢