【发布时间】:2013-01-30 02:33:54
【问题描述】:
我需要帮助才能让这段代码的损坏部分正常工作。
如何根据字符串标记调度两个函数(返回不同的值类型)?
如果可以简化整体代码以使用字符串进行调度,请提出建议。泰。
要求:
- 基于字符串的调度
- 矩形重载需要返回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
}
【问题讨论】:
-
@Non-StopTimeTravel 实现不佳(当意图是使用字符串进行调度时),需要一些其他满足要求的技术
-
实施不善如何?我试图让你提出一个实际的具体问题陈述。
-
@Non-StopTimeTravel OP 已修复