Nimrod

Nimrod

V2EX 第 357509 号会员,加入于 2018-10-22 08:03:23 +08:00
今日活跃度排名 4885
根据 Nimrod 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
Nimrod 最近回复了
16 小时 16 分钟前
回复了 aqtata 创建的主题 C++ 这种情况如何消除几百个 if/else
运行时值到类型的分发,具体的,这里就是`N` 到 `void foo<N>(myclass<N>&)`。
这里存在一个问题需要楼主表达清楚,对应类型的参数是如何构造出来的。
这里为作简化`void foo<N>()`

核心逻辑是做一次`int V`到`std::integral_constant<int, V>`的映射,再用 lambda 包装一下原本的`foo<N>`使得能用上推断出来的类型。

```cpp
#define DISPATCH(VALUE) \
case VALUE: \
return f(std::integral_constant<int, VALUE>{});


// trampline function
template <typename F>
auto dispatcher(F&& f, int value) {
switch(value) {
DISPATCH(0x1f0)
DISPATCH(0x1f1)
DISPATCH(0x1f2)
default:
throw std::runtime_error("Unregistered value");
}
}

void foo_wrapper(int num) {
dispatcher([](auto type){
constexpr auto v = decltype(type)::value;
foo<v>();
}, num);
}
```
这里,`dispatcher`是可以完全可以复用的。
[Demo]( https://godbolt.org/z/5TdevE4We)

剩下的就是手动`DISPATCH(N)`来注册你需要的值,也可以使用 BOOST_PP_REPEAT 来生成代码。
[Demo]( https://godbolt.org/z/1893bzEs8)

运行时的类型分发可以参考我的这篇博客,https://nimrod.blog/posts/cpp-elegant-ways-to-map-runtime-values-to-types
@lovelylain #43 快炸了有准备方案么?先把下一个 AIO 准备好,随时顶上。
@Seria #94 这是什么神奇的食谱,有科学依据么?
2023-01-10 13:52:26 +08:00
回复了 ebony0319 创建的主题 C++ 我想直接学 C++ 20 有推荐的资料么
推荐 [C++20 - The Complete Guide]( https://leanpub.com/cpp20)

@aqtata 简单看了下,C++20 相关完成度非常低。
2022-02-03 23:55:06 +08:00
回复了 elliotloststh 创建的主题 推广 搭了个 blog,现在有五篇文章了,欢迎大佬来玩
@leimao #5 有幸拜读过一些文章,赞👍
2022-02-02 23:23:41 +08:00
回复了 jdz 创建的主题 C++ 怎么系统学习下模板,求推荐书籍,博客
推荐两本书
1. C++ Templates: The Complete Guide 2nd Edition
2. [C++ Concepts]( https://leanpub.com/cppconcepts/)
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2707 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 11ms · UTC 05:15 · PVG 13:15 · LAX 21:15 · JFK 00:15
Developed with CodeLauncher
♥ Do have faith in what you're doing.