【问题标题】:Integer to template type collection in C++整数到 C++ 中的模板类型集合
【发布时间】:2018-06-25 18:53:16
【问题描述】:

在 C++ 中是否有任何方法可以创建将整数与模板 type 匹配的运行时可修改集合?

首先我想:

std::map<uint32_t, std::type_index> type;

但是std::type_index 的用处很小。我需要能够按该类型进行转换并将其用作std::is_convertible的参数

所以 api 应该可以这样:

my_collection.add<1234, std::string>();
my_collection.get<1234>()::type // type is std::string

或者实际上我可以在运行时使用的任何其他足够接近的东西:)

【问题讨论】:

  • 模板是编译时结构。如果集合也是编译时的东西,这可能是可能的,但你不能在运行时制作编译时的东西。
  • 并非如此。类型必须在编译时已知。您可以使用的一件事是std::variant/std::any 和std::visit。
  • @PiotrK,如果性能无关紧要,可以从std::vector&lt;std::any&gt; 和一些标签类型中变出一个怪物。
  • @PiotrK,我会在我的回答中使用std::any。之后我会实施并尝试一下。
  • 某种元组?

标签: c++ templates collections metaprogramming


【解决方案1】:

没有。

如果您支持的类型列表可以有限且集中地枚举,则可以使用 std::variant 或 boost::variant 或自己滚动。

如果您支持的类型的操作列表可以有限且集中地枚举,则可以使用std::any 或boost::any 以及类型擦除技术来解决您的问题。 Here is an overly generic system to type erase nearly any single-dispatch operation.

您可以使用std::any 或boots::any 来获得一个非集中但局部有限枚举的类型列表,但只有在每个枚举位置已知的确切类型在该位置起作用。

你可以做以上的组合。

否则,您将进入动态 C++ 库的运行时编译并传递结果和/或带有源代码的原始 C++ 的世界。进行动态编译。

所有这一切都取决于您提出这个作为“解决方案”的确切、实际问题是什么;可能会有一个相关问题,您的回答是“是”,而该相关问题可能是您实际需要解决的问题。

但您提出的问题的答案只是“否”。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
相关资源
最近更新 更多