【问题标题】:Using a type as an indexer使用类型作为索引器
【发布时间】:2017-09-28 00:37:06
【问题描述】:

考虑一个包含组件映射的类,其中每个组件都由其类型标识,这意味着每个 Component 在其类型上都是唯一的。

std::map<std::type_index, Component*>

使用模板和typeof,我为这些组件创建了一个getter:

Physics *p = object.get<Physics>();

我已经很满意了,但是有没有办法将这种模板类型用作索引器?像这样的:

Physics *p = object[Physics];

【问题讨论】:

  • 不确定,但是您可以重载operator[],但它需要将值作为参数,如果可以将其称为objects[Physics()],则可以通过创建临时的开销来实现对应的类型。否则你可能需要一些宏魔法
  • 旁注:如果您已经在使用模板,那么将它们专门用于某些类型会“更好”,而不是使用 if 链来比较类型。
  • 你希望这是什么类型的object.get[rand()%2?Physics:Biology]
  • 使用 typeid 和它的哈希值怎么样?

标签: c++ templates syntactic-sugar indexer


【解决方案1】:

这可能是您无需借助宏或创建不必要的实例即可达到的最佳效果:

int main()
{
    map m;
    m[type_w<int>] = /* ... */;
}

实施:

template <typename T>
struct type_wrapper { using type = T; };

template <typename T>
inline constexpr type_wrapper<T> type_w{};

struct map
{
    template <typename T>
    void operator[](type_wrapper<T>) { }
};

live wandbox example

【讨论】:

    【解决方案2】:

    Physics 是一种类型,因此您不能将其传递给函数(运算符只是函数的语法糖)。你可以做的是传递一个实例:

    Physics *p = object[Physics{}]; // assuming Physics is default-constructible
    

    但是,如果您无法随时创建Physics 实例,那么该解决方案将不起作用。另一种解决方案是创建一个enum,并将其传递给操作员:

    enum class types {
        Physics, SomethingElse
    };
    
    Physics *p = object[types::Physics];
    

    您必须比较传递给函数的types 的值,而不是使用typeof

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 2020-07-17
      • 1970-01-01
      • 2018-02-13
      • 2023-01-31
      • 2017-08-12
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多