gpt4 book ai didi

C++函数接受函数指针和非静态成员函数作为参数

转载 作者:行者123 更新时间:2023-11-28 02:04:51 30 4
gpt4 key购买 nike

我构建了一个采用函数指针的接口(interface)。有时这个计算依赖于状态,我想把它封装在一个类中并传递它的方法:

#include <iostream>


class Printer {
public:
static void print(int i) { // Want to get rid of the static
std::cout << i << "\n";
}
};


template<typename int_func>
void with_1(int_func func) {
func(1);
}


int main(int argc, char const *argv[]) {
Printer printer;
with_1(printer.print);
return 0;
}

我需要非静态方法(甚至更喜欢重载 operator())。但是,删除静态会导致 错误:指向绑定(bind)函数的指针只能用于调用函数

我可以使用这样的假人:

Printer printer;
void dummy(int i) {
printer.print(i);
}


int main(int argc, char const *argv[]) {
with_1(dummy);
return 0;
}

但这对我来说并不优雅。我可以编写一个同时接受函数指针和非静态方法的模板吗?或者是否有更好的设计模式来解决我的问题?

最佳答案

你不能像这样简单地传递非静态方法,因为它们在实例上工作。一个简单的解决方案是使用 lambda:

#include <iostream>


class Printer {
public:
static void print(int i) { // Want to get rid of the static
std::cout << i << "\n";
}
};


template<typename int_func>
void with_1(int_func func) {
func(1);
}


int main(int argc, char const *argv[]) {
Printer printer;

// Can use capture by reference because we are sure printer still
// exist during execution of with_1
with_1([&printer](int i){ printer.print(i); });

return 0;
}

example

关于C++函数接受函数指针和非静态成员函数作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37924781/

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