我正在使用带有文件系统API的新的和现代的C ++ 17。我正在Windows中使用Visual Studio 2017。
以下代码给出了意外的结果:
#include <iostream>
#include <filesystem>
int main()
{
std::filesystem::path path(R"(D:\dir\file.cpp)");
for (auto& dir : path)
{
std::cout<<dir<<std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
"D:"
"\\"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)
为什么打印“ \\”?
在GCC 9.1.0中对此进行测试(请在路径变量中将“ \”更改为“ /”),结果是:
"D:"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)
为什么行为不同?
根据C ++ 17标准,哪个结果正确?
为了填充std::vector<struct_name>from std::cin,我通常写如下代码:
struct point{
int x, y;
};
int main()
{
std::size_t n;
std::cin>>n;
std::vector<point> vec(n);
for (auto& p:vec)
std::cin>>p.x>>p.y;
//...
}
Run Code Online (Sandbox Code Playgroud)
但是今天我发现了另一种使用默认构造函数的方法:
struct point{
int x, y;
point(){
std::cin>>x>>y;
}
};
int main()
{
std::size_t n;
std::cin>>n;
std::vector<point> vec(n);
//...
}
Run Code Online (Sandbox Code Playgroud)
问题:
我对根据 C++11(和更新的)标准的行为感兴趣
C ++ 17包括一个新的可移植API,用于处理文件系统(<filesystem>)。
我的程序解压缩了一个存档。该档案包含文件,目录和每个文件的创建时间。有了新的API,我有了一个可移植的solotution,用于创建目录(std::filesystem::create_directories),并且正在std::ofstream用于创建文件。
我可以使用新的API设置文件创建(或修改)时间吗?
编辑:时间,由归档提供的时间-是秒,从1970.01.01 00:00:00(UNIX纪元时间)开始
我目前正在开发一个类来处理大的无符号整数。但是,我需要不完整的功能,即:
\nbi_uint+=bi_uint- 已经实施。没什么好抱怨的。bi_uint*=std::uint_fast64_t- 已经实施。没什么好抱怨的。bi_uint/=std::uint_fast64_t- 已实现,但工作速度非常慢,还需要两倍宽的类型uint_fast64_t。在测试用例中,除法比乘法慢35倍接下来,我将给出我的除法实现,它基于一个简单的长除法算法:
\n#include <climits>\n#include <cstdint>\n#include <limits>\n#include <vector>\n\nclass bi_uint\n{\npublic:\n using u64_t = std::uint_fast64_t;\n constexpr static std::size_t u64_bits = CHAR_BIT * sizeof(u64_t);\n using u128_t = unsigned __int128;\n static_assert(sizeof(u128_t) >= sizeof(u64_t) * 2);\n\n //little-endian\n std::vector<u64_t> data;\n\n //User should guarantee data.size()>0 and val>0\n void self_div(const u64_t val)\n {\n auto it = data.rbegin();\n\n if(data.size() == 1) {\n *it /= val;\n return;\n } \n \n …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
enum type_kind{unkown=-1,carray, multi_carray};
template<class T>
struct detect_carray{
constexpr static int kind=unkown;
};
template<class T, std::size_t N>
struct detect_carray<T[N]>{
constexpr static int kind=carray;
};
Run Code Online (Sandbox Code Playgroud)
现在,我想添加另一个专门用于检测 C 风格的多维数组的专业化,即T[a][b]....
实现此目的的语法是什么?我可以使用可变参数模板吗?
我期望以下行为:
int main()
{
std::cout<<detect_carray<std::vector<int>>::kind;//-1
std::cout<<detect_carray<int[3]>::kind;//0
std::cout<<detect_carray<double[3][5]>::kind;//1
std::cout<<detect_carray<std::complex<double>[3][5][8][16]>::kind;//1
//Correct out: -1011
}
Run Code Online (Sandbox Code Playgroud)