Visual Studio Enterprise 2022(64位) 版本 17.4.3
CMake 3.8
#include<iostream>
#include<string_view>
#include<format>
template < typename... Args>
void print(const std::string_view fmt_str, Args&&... args) {
auto fmt_args{ std::msake_format_args(args...) };
std::string outstr{ std::vformat(fmt_str, fmt_args) };
fputs(outstr.c_str(), stdout);
}
struct Frac {
int a, b;
};
template<>
struct std::formatter<Frac> {
template<typename ParseContext>
constexpr auto parse(ParseContext& ctx) {
return ctx.begin();
}
template<typename FormatContext>
auto format(const Frac& f, FormatContext& ctx) {
return std::format_to(ctx.out(), "{0:d}/{1:d}", f.a, f.b);
}
};
int main() {
Frac f{ 1,10 };
print("{}", f);
}
//格式化规则参见 https://zh.cppreference.com/w/cpp/utility/format/formatter
//特化规则参见: https://zh.cppreference.com/w/cpp/named_req/Formatter
#include<iostream>
#include<vector>
constexpr auto f() {
std::vector<int>v{ 1,2,3 };
return v;
}
constexpr auto f2() {
int* p = new int{ 10 };
//未delete解除分配
return *p;
}
int main() {
constexpr auto n = f().size();//√
//constexpr auto n2 = f()//error
//constexpr auto n3 = f2()//error
}
//constexpr: https://zh.cppreference.com/w/cpp/language/constexpr
#include<iostream>
template<class T,class U>
constexpr bool cmp_less(T t, U u)noexcept {
using UT = std::make_unsigned_t<T>;//有符号类型到无符号类型的安全转换。
using UU = std::make_unsigned_t<U>;
if constexpr (std::is_signed_v <T> == std::is_signed_v<U>)
return t < u;
else if constexpr (std::is_signed_v<T>)
return t < 0 ? true : UT(t) < u;
else
return u < 0 ? false : t < UU(u);
}
int main() {
std::cout << std::boolalpha << (5u < -1) << '\n';//true
std::cout << std::boolalpha << ::cmp_less(5u, 1) << '\n';//false
std::cout << std::boolalpha << ::cmp_less(5u, 2u) << '\n';//false
}
//整数比较函数: https://zh.cppreference.com/w/cpp/utility/intcmp
#include<iostream>
struct X {
int a{};
double b{};
char c{};
friend auto operator<=>(const X&,const X&) = default;
};
struct Y {
int a = 6;
};
auto operator<=>(const Y& y, const Y& y2)noexcept->int {//自定义
if (y.a == y2.a)return 0;
if (y.a > y2.a)return 1;
if (y.a < y2.a)return -1;
}
auto operator==(const Y& y, const Y& y2)noexcept->bool {
return y.a == y2.a;
}
int main() {
X x{ 10,1.2,'*' };
X x2{ 10,1,'*' };
x == x2;
x <= x2;
x != x2;
x >= x2;
Y y{ 1 };
Y y2{ 2 };
std::cout << (y <=> y2) << '\n'; //-1
std::cout << std::boolalpha << (y > y2) << '\n';//false
std::cout << std::boolalpha << (y < y2) << '\n';//true
std::cout << std::boolalpha << (y != y2) << '\n';//true
}
//三路比较运算符: https://zh.cppreference.com/w/cpp/language/operator_comparison
//默认比较: https://zh.cppreference.com/w/cpp/language/default_comparisons
#include<iostream>
#include<version>
#ifdef __cpp_lib_three_way_comparison
# include<compare>
#else
# error 没有与之对应的头文件
#endif // __cpp_lib_three_way_comparison
#ifdef __cpp_lib_format
# include<format>
#else
# error 没有与之对应的头文件
#endif // __cpp_lib_three_way_comparison
#if __has_include(<iostream>)//检查能不能找到这个文件,如果能找到这个宏就返回1
# include <iostream>
#endif
int main() {
std::cout << __cpp_lib_three_way_comparison << '\n';//为 201907,意味着其在 2019 年 7 月采纳。
std::cout << __cpp_lib_format << '\n'; //为 202110,意味着其在 2021 年 10 月采纳。
}
//库功能性测试宏: https://zh.cppreference.com/w/cpp/utility/feature_test
//诊断指令: https://zh.cppreference.com/w/cpp/preprocessor/error
#include<iostream>
template<std::integral T>
void f(T t){}
template<class T>
requires std::integral<T> || std::is_pointer_v<T>
struct X {
};
template<class T>
requires std::is_integral_v<T>
T n{};
template<class T>
concept love = std::is_integral_v<T> && (std::is_same_v<int, T> || std::is_same_v<uint32_t, T>);
void f2(love auto){}
int main() {
f(1);
f('*');
//f(1.2);
X<int>x;
//X<double>x2;
X<double*>x3;
n<int> = 3;
//n<double>;
std::cout << n<int> << '\n';
f2(1);
f2(1u);
//f2(1l);
}
//Requires表达式 https://zh.cppreference.com/w/cpp/language/requires
//约束与概念 https://zh.cppreference.com/w/cpp/language/constraints
1.8模块.cpp
import test;
int main() {
/*int n[]{
#include"t.txt"
};
for (auto i : n) {
std::cout << i << ' ';
}*/
std::cout << mylib::add(1, 2) << '\n';
//mylib::print("*");
t();
}
//模块: https://zh.cppreference.com/w/cpp/language/modules
//编译设置:add_executable (Test1 "src/1.8模块.cpp" "src/test.ixx" "src/test2.ixx")
test.ixx
module;
#define PI 3.14
export module test;
export import<iostream>;
export import test2;
namespace mylib {
export auto add(std::integral auto a, std::integral auto b) {
return a + b;
}
auto print(auto t) {
std::cout << t << '\n';
}
}
test2.ixx
export module test2;
import<iostream>;
export void t() {
std::cout << "乐\n";
}
t.txt
1,2,3,4,5
#include<iostream>
#include<ranges>
#include<vector>
namespace stdv = std::views;
namespace stdr = std::ranges;
void print(stdr::range auto v) {
for (const auto& i : v)std::cout << i << ' ';
endl(std::cout);
}
int main() {
std::vector nums{ 1,2,3,4,5,6,7,8,9,10 };
auto ret = nums | stdv::take(5) | stdv::reverse;
print(ret);
auto ret2 = nums | stdv::filter([](int i) {return i > 6; });
print(ret2);
auto ret3 = nums | stdv::transform([](int i) {return i * i; });
print(ret3);
print(nums);//视图是不会改变原来的数据的
std::vector<std::string>strs{ "🐴","🐭","🥵","🤣" };
auto ret4 = strs | stdv::reverse;
print(ret4);
auto ret5 = nums | stdv::filter([](int i) {return i % 2 != 0; }) | stdv::transform([](int i) {return i * 2; });
print(ret5);
auto nums_ = stdv::iota(1, 10);
print(nums_);
auto rnums = stdv::iota(1) | stdv::take(200);
print(rnums);
stdr::copy(strs | stdv::reverse | stdv::drop(2), std::ostream_iterator<std::string>(std::cout," "));
}
//范围库: https://zh.cppreference.com/w/cpp/ranges