如何将非静态成员函数传递给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,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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...