其实是前面两篇文章的改进,我们也不多说了,print这个没点水平估计是看不懂
namespace show_ {
template<typename T,size_t i>
void print(const T(&n)[i], const std::string s=" ") {
std::copy(std::begin(n),std::end(n), std::ostream_iterator<T, char>(std::cout, s.data()));
std::cout << std::endl;
}
template<typename T,size_t size>
void print(const std::array<T,size> v, const std::string s = " ") {
std::copy(std::begin(v), std::end(v), std::ostream_iterator<T, char>(std::cout, s.data()));
std::cout << std::endl;
}
void print(const char* s) {
std::cout << s << std::endl; //重载特殊情况,字符串常量输出
}
template<typename T>
void print(const std::vector<T>n,const std::string s=" ") {
std::copy(std::begin(n), std::end(n), std::ostream_iterator<T, char>(std::cout, s.data()));
std::endl(std::cout);
}
template<typename T>
void print(T v) {
std::cout << v << std::endl;
}
template<typename T>
void print(const std::list<T>& L,std::string s=" ") {
for (auto it = L.begin(); it != L.end(); it++) { //list容器版本
std::cout << *it << s;
}
std::cout << std::endl;
}
template<typename _Type1, typename _Type2, typename... _Types>
void print(_Type1 _Value1, _Type2 _Value2, _Types... _Values)//c++17折叠表达式
requires (sizeof...(_Types) > 0 || (!std::is_same_v<char*, _Type2> && !std::is_same_v<const char*, _Type2>))//requires是c++20的
{
std::cout << _Value1 << ',' << _Value2 << ",";
((std::cout << _Values ), ...);
}
namespace object { //这真是无奈之举,这个匹配,object命名空间内的除了遍历vector和array的数组外,标准数据类型直接打印也可行
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& data)
{
for (auto& str : data)
{
os << str;
}
return os;
}
template<typename T, size_t size>
std::ostream& operator<<(std::ostream& os, const std::array<T, size>& data)
{
for (auto& str : data)
{
os << str<<",";
}
return os;
}
void print() {}
template<typename T, typename...Types>
void print(T first, Types...args) {
std::cout << first << '\n';
print(args...);
return;
}
}
}
这是print,下面是测试的一部分代码
#include"func.h" using namespace show_;//引入命名空间,所以写不写命名空间都行 int main() { int n[10]{ 1,2,3,4,5,6,7,8,9,10 }; std::vector<double>i{ 1.2,3,5,4,8,7,9,10,11,30.8 }; std::cout << ::sort_::average(n, 0, 9) << std::endl; std::cout << ::sort_::sum(n, 0, 9) << std::endl; ::sort_::Inverted(n, 0, 9);//逆置 for (auto i : n)std::cout << i << ","; std::endl(std::cout); std::cout << ::maxAmin::max(i) << "," << ::maxAmin::max(n) << std::endl; std::cout << ::maxAmin::min(i) << "," << ::maxAmin::min(n) << std::endl; show_::print(n,","); show_::print(n); show_::print(i); show_::print(i,"*"); show_::print(1, 2, 3, 4, 5, "666", "阿巴巴"); std::endl(std::cout); print(1); show_::print("可怕"); show_::print(5.7); const std::string str("离谱"); show_::print(str); print(5); print(std::move(12)); show_::print(std::move(n)); std::array<int, 5>v{ 1,2,3,4,5 }; print(v); std::list<double>L{ 1.2,3.4,5.6,7.8,9,10,11,12 }; print(L); print(L, ","); int a = 5; print(&a); size_t a2 = 10; print(a2); print("666666666", 5, 5.7, 8u); std::cout << std::endl; std::array<std::string, 1>a1{ "离谱" }, b1{ "6666" }, c1{ "阿巴巴" };//如果数组长度比初始化的长到时候就会一堆逗号 std::vector<std::string>a3{ "离谱2" }, b2{ "66662" }, c2{ "阿巴巴2" }; object::print(a1, b1, c1, 1000); print("下面是测试"); object::print(a1, b1, c1); object::print(a3, b2, c2, 66666); object::print(666666); object::print(n,"是吗","6666"); object::print("66666", "离谱"); std::array<int, 10>A{ 1,2,3,4,5,6,7,8,9,10 }, B{ 10,9,8,7,6,5,4,3,2,1 }; std::vector<std::string>A1{ "离谱" }, B1{ "6666" }, C1{ "阿巴巴" }; object::print("可以",A, B, 10); object::print(A1, B1, C1, 666); return 0; }
能看懂就看吧,下面是文件的命名空间
namespace file_ {
//获取当前时间的字符串
std::string time_() {
time_t timep;
time(&timep);
char tmp[256];
strftime(tmp, sizeof(tmp), "%Y年%m月%d日_%H点%M分%S秒", localtime(&timep));
std::string s{ tmp };
return s;
}
//创建文件夹,默认在同级目录
std::string newFolder(std::string name = time_(), std::string path = "") {
std::string temp = "md ";
temp += path;
temp += name;
//std::cout << "创建文件夹 " << temp << std::endl;
system(temp.data());
return temp.substr(3);
}
//删除文件夹
std::string deleteFolber(std::string path) {
std::string s = "rd ";
system((s += path).data());
return s.substr(3);
}
//以追加模式打开写文件
std::string newWriteFile(std::string name = time_()+=".txt", std::string data = time_(), std::string path = "") {
path += name;
std::ofstream ofs;
ofs.open(path, std::ios::app);
ofs << data;
ofs.close();
return path;
}
//创建新的文件写入,一开始有就删除再创建
void newlyFile(std::string name = time_(), std::string data = time_(), std::string path = "") {
path += name;
std::ofstream ofs;
ofs.open(path, std::ios::trunc);
ofs << data;
ofs.close();
}
//删除文件的数据
void deleteData(std::string name ,std::string path = "") {
path += name;
std::ofstream ofs(path, std::ios::trunc);
ofs.close();
}
//删除文件
bool deleteFile(std::string path) {
if (remove(path.data()) == 0) {
//std::cout << "删除成功" << std::endl;
return true;
}
else {
std::cout << "删除失败" << std::endl;
return false;
}
}
//读取文件
std::string readFile(std::string path) {
std::ifstream ifs;
ifs.open(path, std::ios::in);
if (!ifs.is_open())
{
std::cout << "文件打开失败" << std::endl;
return "";
}
std::string data{};
while (ifs >> data);
ifs.close();
return data;
}
//打印输出
void print(std::string path) {
show_::print(readFile(path));
}
}
MSVC ,C++20,debug,明天见