使用类型作为索引器

时间:2017-04-30 09:19:12

标签: c++ templates syntactic-sugar indexer

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

var2

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

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

我对此已经非常满意,但有没有办法将此模板类型用作索引器?像这样:

typeof

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

但是,如果您无法创建Physics实例,那么该解决方案将无效。另一种解决方案是创建enum,并将其传递给运营商:

enum class types {
    Physics, SomethingElse
};

Physics *p = object[types::Physics];

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