c++ - 如何在 C++ 中使用映射实现模板的返回类型查找?

标签 c++ templates enums return-type

我有两个数组。一个包含指向基类的指针。另一个包含一个 Enum,其值给出关于实际类型的指针。

我现在想要一个函数,它可以为我获取一个数组,其中包含那些具有与之关联的特定枚举值的条目,并以正确的返回类型返回该数组。

示例(半伪代码):

std::array<BaseType, 2> a = { TypeAInstance, TypeBInstance };
std::array<TypeEnum, 2> b = { TypeA, TypeB };

template<typename SearchType>
std::array<SearchType*, 2> GetEntriesOfType()
{
  std::array<SearchType*, 2> ret;
  for(int i = 0; i < 2; i++) 
  {
    ret[i] = nullptr;
    if(b[i] == EnumForType(SearchType)) ret[i] = a[i];
  }
}

但是我不知道如何构建 EnumForType 函数或反向 TypeForEnum 函数,这将允许我使用以下方法声明模板返回类型:

template<SearchTypeEnum>
TypeForEnum(SearchTypeEnum) GetEntriesOfType();

如果可能的话,我想定义这样一个 constexpr 函数。

潜在的问题是我有一个迭代的插件数组。每个插件需要根据类型进行不同的处理。但是,由于类型依赖于运行时并且我不能进行动态分配(嵌入式系统约束),所以我将所有插件存储在固定的预留内存空间中。我需要在运行时以某种方式将指向基类的指针转换为其正确的类型,并相应地进行处理。

这个 GetEntriesOfType 函数应该会更方便。我当然可以获取两个数组,然后在迭代两个数组的同时执行 switch 语句,但我想将其简化为该库的最终用户。

最佳答案

一种方法是将每个类类型映射到一个枚举值:

class A;
class B;

enum class Types {
    A,
    B
};

template<class T> struct EnumForType;

template<> struct EnumForType<A> { static constexpr Types value = Types::A; };
template<> struct EnumForType<B> { static constexpr Types value = Types::B; };

int main() {
    auto a = EnumForType<A>::value;
    auto b = EnumForType<B>::value;
}

你会像这样使用它:

if(b[i] == EnumForType<SearchType>::value)

关于c++ - 如何在 C++ 中使用映射实现模板的返回类型查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836892/

相关文章:

ios - 如何声明枚举从一个对象传递到另一个对象

c++ - 为什么pow()函数不能给出正确的结果来打印两个间隔之间的armstrong数字,但是num * num * num在C++中给出了?

c++ - 将数组中的元素移动 N 个元素

C++模板排序

c++ - 模板元编程 : multiplying a bunch of template arguments

ios - 将枚举案例与参数进行比较

c++ - 是否应该更喜欢 STL 算法而不是手动循环?

c++ - 多态继承不覆盖基类方法

python - 如何直接从文件系统加载 jinja 模板

mysql - 如何在不使用 ENUM 的情况下强制执行 MySQL 表中的某些字符串?