我需要帮助让此代码的已损坏部分正常工作。
如何根据字符串标记调度两个函数(返回不同的值类型)?
如果可以简化整体代码以调度字符串,请提出建议。 TY。
要求:
CODE
#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
}
答案 0 :(得分:1)
除非C ++ 11改变了这个问题。问题是您正在取消引用Shape*
指针,这意味着生成的数据类型(Shape&
)没有{{1的有效重载}}。
您可以执行tag_dispatch
之类的操作。或者更干净地重写如下。
g_mapping["Rectangle"]->tag_dispatch()
这样,您可以支持具有相同接口的非std::string tag_dispatch( Shape& shape)
{
return shape->tag_dispatch();
}
个对象。两者都需要您将Shape
作为tag_dispatch
的虚函数。
答案 1 :(得分:0)
C ++没有动态调度。这可能是您期望发生的事情。您可以使用dynamic_cast模拟它,但这很慢而且不推荐。您可以使用虚函数返回该类型的枚举。
class base
{
public:
virtual ~base() // Don't forget the virtual destructor if you want to inherit from it!
{}
enum type
{
a,
b,
};
virtual type get_type() const = 0;
};
class a : public base
{
public:
virtual type get_type()
{
return base::type::a;
}
};
class b : public base
{
public:
virtual type get_type()
{
return base::type::b;
}
};