C++ 禁忌黑魔法:STMP (下)

C++ 禁忌黑魔法:STMP (下)

💡 原文中文,约6800字,阅读约需17分钟。
📝

内容提要

本文讨论了基于STMP的高级应用,重点介绍了C++中类型与值的双向映射。通过模板元编程,作者实现了类型的注册、查找和排序,构建了一个真正的any类型,简化了类型擦除的过程。尽管这种方法在实际项目中不推荐使用,但为有状态代码的实现提供了新思路。

🎯

关键要点

  • 本文讨论了基于STMP的高级应用,重点介绍了C++中类型与值的双向映射。
  • 通过模板元编程,作者实现了类型的注册、查找和排序,构建了一个真正的any类型。
  • 类型和值之间的映射可以简化类型擦除的过程,尽管在实际项目中不推荐使用。
  • 使用std::sort对type_list进行排序,展示了如何将类型映射到值并进行排序。
  • STMP的实现为有状态代码的实现提供了新思路,但可能导致编译时间增加和ODR违背的问题。

延伸问答

STMP在C++中的应用有哪些?

STMP在C++中主要用于实现类型与值的双向映射,类型注册、查找和排序,以及构建真正的any类型。

如何通过STMP实现类型的注册和查找?

通过模板元编程,使用setter和reader结构体,可以在实例化时注册类型,并通过特化实现查找。

STMP的双向映射如何简化类型擦除?

STMP通过将类型映射到值,计算后再映射回类型,简化了类型擦除的过程,使得类型计算更为简单。

使用STMP时可能遇到哪些问题?

使用STMP可能导致编译时间增加和ODR违背的问题,因此在实际项目中不推荐使用。

如何使用std::sort对type_list进行排序?

可以通过将类型映射到std::array中,然后使用std::ranges::sort对该数组进行排序,最后再映射回type_list。

STMP如何实现一个真正的any类型?

STMP通过记录所有实例化的类型,结合模板元编程,允许在运行时直接调用any内部类型的成员函数,而无需手动cast。

➡️

继续阅读