我需要帮助让这段代码的损坏部分正常工作。
如何根据字符串标记调度两个函数(返回不同的值类型)?
如果可以简化整体代码以使用字符串进行调度,请提出建议。泰。
要求:
- 基于字符串的调度
- 矩形重载需要返回int,而Circle重载需要返回std::string
- 从 Rectangle_Type 到 int 和 Circle_Type 到 std::string 的映射是固定的并且在编译时是已知的。我的部分问题是 std::map 是一个运行时构造:我不知道如何使 std::string 到标记映射一个编译时构造。
- 如有必要,运行时解析是可以的:但是,调度必须允许基于解析到的枚举/类型的不同返回类型。
代码
#include <map>
#include <string>
#include <iostream>
struct Shape { };
struct Rectangle_Type : public Shape { using value_type=int; };
struct Circle_Type : public Shape { using value_type=std::string; };
Rectangle_Type Rectangle;
Circle_Type Circle;
static std::map<std::string,Shape*> g_mapping =
{
{ "Rectangle", &Rectangle },
{ "Circle", &Circle }
};
int tag_dispatch( Rectangle_Type )
{
return 42;
}
std::string tag_dispatch( Circle_Type )
{
return "foo";
}
int
main()
{
std::cerr << tag_dispatch( Circle ) << std::endl; // OK
std::cerr << tag_dispatch( Rectangle ) << std::endl; // OK
#define BROKEN
#ifdef BROKEN
std::cerr << tag_dispatch( (*g_mapping["Rectangle"]) ) << std::endl;
std::cerr << tag_dispatch( (*g_mapping["Circle"]) ) << std::endl;
#endif
}