问题描述
我想包装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();