将目录迭代器切换为同一循环的递归?
Switching directory iterator to recursive for the same loop?
是否可以在同一个循环中切换目录迭代器的递归和非递归版本?我想这样做的原因是我真的不想为了递归版本而重复我的整个代码。
#include <iostream>
#include <filesystem>
#include <string>
int main()
{
std::string DirPath = "C:\Users";
// Switch loop to recusive
bool isRecursive = false;
// ERROR: Not working
auto it = isRecursive ? std::filesystem::recursive_directory_iterator(DirPath) :
std::filesystem::directory_iterator(DirPath);
for (const auto& entry : it) {
if (std::filesystem::is_regular_file(entry)) {
// .......
}
}
}
它不起作用,因为这两个迭代器具有不同的类型并且不能转换为通用类型。因此 auto
现在不能,它应该是什么类型。你有两个可能性:
recursive_directory_iterator
具有方法 disable_recursion_pending
,该方法在下一个增量之前禁用递归,因此您必须在每个循环中调用一次。
问题"I have two very similar things that do nearly the same but are not exactly the same and I don't want to write my code two times."非常适合应用模板。写一个方法
template<typename DirectoryIter>
void iter_dir(DirectoryIter it)
{ /* your code */ }
void iter_dir(const std::string& DirPath, bool recursive) // So you don't have to construct the iterators in your caller code
{
if(recursive)
iter_dir(std::filesystem::recursive_directory_iterator(DirPath));
else
iter_dir(std::filesystem::directory_iterator(DirPath));
}
我个人更喜欢第二种。我发现它比在每次迭代中使用递归迭代器更整洁。
是否可以在同一个循环中切换目录迭代器的递归和非递归版本?我想这样做的原因是我真的不想为了递归版本而重复我的整个代码。
#include <iostream>
#include <filesystem>
#include <string>
int main()
{
std::string DirPath = "C:\Users";
// Switch loop to recusive
bool isRecursive = false;
// ERROR: Not working
auto it = isRecursive ? std::filesystem::recursive_directory_iterator(DirPath) :
std::filesystem::directory_iterator(DirPath);
for (const auto& entry : it) {
if (std::filesystem::is_regular_file(entry)) {
// .......
}
}
}
它不起作用,因为这两个迭代器具有不同的类型并且不能转换为通用类型。因此 auto
现在不能,它应该是什么类型。你有两个可能性:
recursive_directory_iterator
具有方法 disable_recursion_pending
,该方法在下一个增量之前禁用递归,因此您必须在每个循环中调用一次。
问题"I have two very similar things that do nearly the same but are not exactly the same and I don't want to write my code two times."非常适合应用模板。写一个方法
template<typename DirectoryIter>
void iter_dir(DirectoryIter it)
{ /* your code */ }
void iter_dir(const std::string& DirPath, bool recursive) // So you don't have to construct the iterators in your caller code
{
if(recursive)
iter_dir(std::filesystem::recursive_directory_iterator(DirPath));
else
iter_dir(std::filesystem::directory_iterator(DirPath));
}
我个人更喜欢第二种。我发现它比在每次迭代中使用递归迭代器更整洁。