繁体   English   中英

如何将非静态成员函数传递给 ftw?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM