![](/img/trans.png)
[英]How can I call a non-static member function of a class from a static member function of another class?
[英]How can I pass a non-static member function to ftw?
我是 C++ 编码新手,我遇到了这个问题:我想做这样的事情
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <ftw.h>
class Foo {
public:
int func1 (const char *fpath, const struct stat *sb, int typeflag){
total += sb->st_size;
std::cout << total << std::endl;
return 0;
}
int func2(){
ftw("plots", func1, 3);
}
int total;
};
func1 不是静态的这一事实是否有任何解决办法? 我还尝试在func2()
中定义一个 lambda(或 std::function)以便将其传递给 ftw(),但它需要int (*)(const char*, const stat*, int)
作为第二个参数,因此它不起作用。
提前致谢。
您可以将std::function
存储在静态变量中,并拥有一个“转发”调用的静态函数:
class Foo {
public:
int func1 (const char *fpath, const struct stat *sb, int typeflag){
total += sb->st_size;
std::cout << total << std::endl;
return 0;
}
int func2(){
ftwForwardTo = [&this] (const char *fpath, const struct stat *sb, int typeflag) {
return func1(fpath, sb, typeflag);
};
ftw("plots", forwardFtw, 3);
}
int total;
private:
static std::function<int(const char *, const stat *, int)> ftwForwardTo;
static int forwardFtw(const char *fpath, const struct stat *sb, int typeflag){
ftwForwardFunc(fpath, sb, typeflag);
}
};
我没有测试这段代码,但你明白了。
请注意,这既不是线程安全的,也不是可重入的。
在 C++17 中,您可以使用std::filesystem::recursive_directory_iterator
来获得不那么笨拙的解决方案。
对于较旧的 C++ 版本,您可能可以在 Boost 中找到一些东西。
func1
有一个名为this
隐藏参数,这意味着它的签名不符合 ftw 参数的要求。
我鼓励你制作静态/全局函数并准备一些全局或单调变量来保存目标函数func1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.