问题描述
我是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,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,int typeflag){
ftwForwardFunc(fpath,typeflag);
}
};
我没有测试这段代码,但是您明白了。
请注意,这既不是线程安全的,也不是可重入的。
在C ++ 17中,您可以使用std::filesystem::recursive_directory_iterator
来降低恶意程度。
对于较旧的C ++版本,您可能可以在Boost中找到某些内容。
, func1
具有名为this
的隐藏参数,这意味着其签名与ftw参数的要求不符。
我鼓励您制作静态/全局函数并准备一些全局或单调变量以容纳目标函数func1