gpt4 book ai didi

c++ - 在 C++ 的子类中重载枚举

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:36 25 4
gpt4 key购买 nike

我有兴趣定义一个要继承的通用类,它基于枚举和该枚举到某些数据结构的映射以不同方式运行。

在下面的代码中,我让 test_child 继承自 test_parent,它已经实现了共享功能。我的计划是让许多类继承自 parent_class 之类的类,但要定义一个独特的“字段”枚举和相应的“映射”映射。

#include <iostream>
#include <string>
#include <unordered_map>

class test_parent {
public:
enum class field {
A,
B,
C
};

typedef struct {
std::string s;
int i, j;
} data_t;

std::unordered_map<field, data_t> mapping {
{field::A, {"A", 1, 1}},
{field::B, {"B", 2, 2}},
{field::C, {"C", 3, 3}}
};

int get_i (field f) {
return mapping[f].i;
}

std::string get_s (field f) {
return mapping[f].s;
}
};

class test_child : test_parent {
public:
enum class field {
D,
E
};

std::unordered_map<field, data_t> mapping {
{field::D, {"D", 4, 4}},
{field::E, {"E", 5, 5}}
};
};

int main () {
test_parent tp;
test_child tc;

std::cout << tp.get_i(test_parent::field::A) << " " << tc.get_i(test_child::field::E) << std::endl;

return 0;
}

此代码返回编译错误:

test.cpp: In function ‘int main()’:
test.cpp:55:86: error: no matching function for call to ‘test_child::get_i(test_child::field)’
std::cout << tp.get_i(test_parent::field::A) << " " << tc.get_i(test_child::field::E) << std::endl;
^
test.cpp:28:6: note: candidate: int test_parent::get_i(test_parent::field)
int get_i (field f) {
^~~~~
test.cpp:28:6: note: no known conversion for argument 1 from ‘test_child::field’ to ‘test_parent::field’

但我希望打印的是:

1 5

最佳答案

不确定这是否是您想要的,但是使用模板,您可能会这样做

struct data_t
{
std::string s;
int i;
int j;
};

template <typename E>
class test_parent {
public:
int get_i(E e) const { return mapping.at(e).i; }
const std::string& get_s(E e) const { return mapping.at(e).s; }

static const std::unordered_map<E, data_t> mapping;
};

然后

enum class field_ABC{ A, B, C };
enum class field_DE{ D, E };

template <>
const std::unordered_map<field_ABC , data_t> test_parent<field_ABC >::mapping = {
{field_ABC::A, {"A", 1, 1}},
{field_ABC::B, {"B", 2, 2}},
{field_ABC::C, {"C", 3, 3}}
};

template <>
const std::unordered_map<field_DE, data_t> test_parent<field_DE>::mapping = {
{field_DE::D, {"D", 4, 4}},
{field_DE::E, {"E", 5, 5}}
};

Demo

关于c++ - 在 C++ 的子类中重载枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54356210/

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