如何通过显式名称访问某些成员函数

问题描述

我想包装C ++文件系统用来表示文件文件夹的内容。它具有“目录条目”,它似乎是目录层次结构/树中的各个项目,然后是“路径”,它们似乎是代表文件名/路径的字符串。我希望能够通过限定名称访问路径功能,如下所示:

#include <iostream>
#include <filesystem>
#include <string>

class DirectoryEntry
{public:
    std::filesystem::directory_entry dirEntry;
    // std::filesystem::directory_entry methods
    bool exists() { return dirEntry.exists(); }
    size_t fileSize() { return dirEntry.file_size(); }
    bool isRegularFile() { return dirEntry.is_regular_file(); }
    bool isDirectory() { return dirEntry.is_directory(); }

    //std::filesystem::path methods
    bool hasExtension() { return dirEntry.path().has_extension(); }
    std::string filename() { return dirEntry.path().filename().string(); }
    std::string extension() { return dirEntry.path().extension().string(); }
};

int main()
{
    DirectoryEntry entry;

    bool b = entry.hasExtension(); 
    // I want to call something "entry.path.hasExtension()"
    // or "entry.path().hasExtension();
}

我考虑过将所有“ path”函数放入一个空的“ class Path”类中,然后在“ DirectoryEntry类”中包含一个“ Path”成员。问题是“ Path”类将没有可以访问std :: filesystem :: directory_entry :: path,因为它在DirectoryEntry类中。我以为可以将参数传递给Path类方法,但是有没有更简单的方法

有人建议我可以使用继承,但是我看不到如何使新的Path类可以访问我需要的std :: filesystem :: path()函数

    class DirectoryEntry : public std::filesystem::directory_entry
    {public:
        typedef std::filesystem::directory_entry base_t;
    
        bool exists() { return base_t::exists(); }
        size_t fileSize() { return base_t::file_size(); }
        bool isRegularFile() { return base_t::is_regular_file(); }
        bool isDirectory() { return base_t::is_directory(); }
    
        struct Path
        {
            bool hasExtension() { return bool(); } // What do I return?
            // return (outerClassObject).path().hasExtension;
    
            std::string filename() { return std::string(); } // What do I return?
            std::string extension() { return std::string(); } // What do I return?
        } path;
    };

This doesn't work. Likewise,passing the std::filesystem::path argument to the my Path class doesn't work:

class DirectoryEntry
{private:
    typedef std::filesystem::path path_t;
    typedef std::filesystem::directory_entry base_t;
    std::filesystem::directory_entry entry;
public:
    bool exists() { return entry.exists(); }
    size_t fileSize() { return entry.file_size(); }
    bool isRegularFile() { return entry.is_regular_file(); }
    bool isDirectory() { return entry.is_directory(); }

    struct Path
    {
        bool hasExtension(const path_t& path) { return path.has_extension(); }
        std::string filename(const path_t& path) { return path.filename().string();} 
        std::string extension(const path_t& path) { return path.extension().string(); } 
    } path;
};

int main()
{
    DirectoryEntry entry;
    entry.isRegularFile();
    entry.path.extension(); // MUST BE PASSED THE std::filesystem::path ARGUMENT

}

看来lubgr的答案是唯一有效的方法。我必须保留另一份std :: filesystem :: path,对吗?

解决方法

您可能想要的是嵌套的内部类型。由于C ++中的嵌套类没有对它们的外部类的隐式访问,因此您需要显式地将引用传递给数据成员,但这不会增加太多的噪音。示例:

class DirectoryEntry {
  public:
   std::filesystem::directory_entry dirEntry;

   // as before ...

   struct Path {
     const std::filesystem::directory_entry& dirEntry;
     bool hasExtension() { return dirEntry.path().has_extension(); }
     std::string filename() { return dirEntry.path().filename().string(); }
     std::string extension() { return dirEntry.path().extension().string(); }
   } path{dirEntry};
};

和用法:

DirectoryEntry entry;

bool b = entry.path.hasExtension();