gpt4 book ai didi

c++ - 从 int 映射到类型说明符

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:47 25 4
gpt4 key购买 nike

我想使用映射来引用类型说明符,主要是为了缩短我的代码,避免多次使用

std::unique_ptr< Class >(new class1);

std::unique_ptr< Class >(new sampleMap[enum1]);

然后定义我的映射,以便它将每个枚举值(enum1enum2、...)引用到我的类(class1class2、...)。

但是我不能用像这样的类型名称来定义我的映射

std::map < int, Class > mapName {
{0, class1},
{0, class1},
...
};

因为 map 中不允许使用类型名称。

我为此寻找答案的主要原因是通过将一系列“if/else if”语句或“switch -case”语句替换为一行来使我的代码更简洁输出 std::unique_ptr<Class>(new class1); 的代码是通过我定义的 map 动态算出来的。因此,我只需输入枚举编号并为我实例化相应的类。否则,我将不得不这样做:

if (enum1 = 0)
{
std::unique_ptr< Class >(new class1);
}
else if (enum2 = 0)
{
std::unique_ptr< Class >(new class2);
}

(或开关盒)但我想像这样在一行中完成以上所有操作:

std::unique_ptr<Class>(new sampleMap[enum1]);

加上 map 声明。

知道如何做到这一点吗?

最佳答案

您无法轻松地实现一个 std::map,它会按照您尝试的方式将类型作为值返回。您需要实现自己的类,将类型表示为值。但是,由于您的目标似乎是创建具体类型取决于值的对象实例,因此一个简单的解决方案是创建一个函数映射。这假定您要支持的所有类型都派生自一个通用类型。每个值都可以包含一个构造正确对象的函数。如果您的类型不是从通用类型派生的,那么您将需要执行进一步的类型删除(可能使用 std::any )。

#include <functional>
#include <iostream>
#include <map>
#include <memory>

// Simple set of classes
// Class is the base type
// Class1 and Class2 derive from Class
struct Class { virtual void func() = 0; };
struct Class1 : Class {
void func() override { std::cout << "Class1\n"; }
};
struct Class2 : Class {
void func() override { std::cout << "Class2\n"; }
};

// A map of factory functions
const std::map<int, std::function<std::unique_ptr<Class>()>> mapName = {
{ 1, []() {return std::make_unique<Class1>(); } },
{ 2, []() {return std::make_unique<Class2>(); } }
};

int main()
{
auto foo = mapName.at(2)(); // Make an object of type associated with the value 2
foo->func(); // Prints "Class2\n"
return 0;
}

关于c++ - 从 int 映射到类型说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com