公众号
qq群 点击进入
RSS https://github.com/wanghenshui/cppweeklynews/releases.atom
欢迎投稿,推荐或自荐文章/软件/资源等
请提交 issue 或评论区留言
本期文章由 不语 黄亮Anthony Tudou kenshin 赞助
勉强算半期吧,返程没时间了,简单更新一下
标准委员会动态/ide/编译器信息放在这里
编译器信息最新动态推荐关注hellogcc公众号 本周更新 2024-02-14 第241期
其实重点比较明朗,就execution reflect graph这些,剩下的基本都是修正
fiber_context也好久了
看一遍基本就把clang llvm这套东西串起来了。都学一下吧,llvm战未来朋友们
感受抽象的gcc sso优化实现
另外clang本来是没做constexpr sso优化的,最近又给加上了
微信群里也讨论了,咨询了maskray老师意见,可能就是为了对齐libstdcxx的行为
我和这个想法相同,你都constexpr了,还sso干啥
感觉有点不认识const了
还挺有意思的
对比rust c++的shared_ptr没有太限制生命周期,可能会用错,c++还是太自由了
就是这种行尾的逗号,对于git merge也友好
// C, C++
Thing a[] = {
{ 1, 2 },
{ 3, 4 },
{ 5, 6 },
// ^ trailing comma
};
// C#
Thing[] a = new[] {
new Thing {
Name = "Bob",
Id = 31415,
// ^ trailing comma
},
new Thing {
Name = "Alice",
Id = 2718,
// ^ trailing comma
},
// ^ trailing comma
};
Dictionary d = new Dictionary<string, Thing>() {
["Bob"] = new Thing("Bob") { Id = 31415 },
["Alice"] = new Thing("Alice", 2718),
// ^ trailing comma
};
感觉这是个不成文规定实现
简单实现
#include <format>
#include <iostream>
class SingleValue {
public:
SingleValue() = default;
explicit SingleValue(int s): singleValue{s} {}
int getValue() const {
return singleValue;
}
private:
int singleValue{};
};
template<>
struct std::formatter<SingleValue> : std::formatter<int> { // (1)
auto format(const SingleValue& singleValue, std::format_context& context) const {
return std::formatter<int>::format(singleValue.getValue(), context);
}
};
int main() {
SingleValue singleValue0;
SingleValue singleValue2020{2020};
SingleValue singleValue2023{2023};
std::cout << std::format("{:*<10}", singleValue0) << '\n';
std::cout << std::format("{:*^10}", singleValue2020) << '\n';
std::cout << std::format("{:*>10}", singleValue2023) << '\n';
}
典型内存池实现介绍
哥们看不懂rsicv 不太懂
直接贴代码吧
template<typename T>
constexpr std::
enable_if_t<
std::conjunction_v<std::is_enum<T>,
// look for enable_bitmask_operator_or
// to enable this operator ①
std::is_same<bool,
decltype(enable_bitmask_operator_or(
std::declval<T>()))>>,
T>
operator|(const T lhs, const T rhs) {
using underlying = std::underlying_type_t<T>;
return static_cast<T>(
static_cast<underlying>(lhs) |
static_cast<underlying>(rhs));
}
namespace Filesystem {
enum class Permission : uint8_t {
Read = 1,
Write,
Execute,
};
// Opt-in for operator| ②
constexpr bool
enable_bitmask_operator_or(Permission);
} // namespace Filesystem
这个玩法就是针对部分提供enable_bitmask_operator_or 的enum class 提供 operator |
现在是2024了,有没有新的玩法
concept
template<typename T>
requires(std::is_enum_v<T>and requires(T e) {
// look for enable_bitmask_operator_or to
// enable this operator ①
enable_bitmask_operator_or(e);
}) constexpr auto
operator|(const T lhs, const T rhs) {
using underlying = std::underlying_type_t<T>;
return static_cast<T>(
static_cast<underlying>(lhs) |
static_cast<underlying>(rhs));
}
namespace Filesystem {
enum class Permission : uint8_t {
Read = 0x01,
Write = 0x02,
Execute = 0x04,
};
// Opt-in for operator| ②
consteval
void enable_bitmask_operator_or(Permission);
} // namespace Filesystem
c++23 有to_underlying了
template<typename T>
requires(std::is_enum_v<T>and requires(T e) {
enable_bitmask_operator_or(e);
}) constexpr auto
operator|(const T lhs, const T rhs)
{
return static_cast<T>(std::to_underlying(lhs) |
std::to_underlying(rhs));
}
简洁一丢丢
我不想返工啊