Я могу предложить эту реализацию:
enum class NodeType { Unknown, String, Int, Float };
using CreateFunc = void(*)(Node *node);
using TypeFunc = bool(*)(Node *node);
// define type-checkers:
bool IsStringNode(Node *node)
{
return dynamic_cast<StringNode*>(node) != nullptr;
}
bool IsIntNode(Node *node)
{
return dynamic_cast<IntNode*>(node) != nullptr;
}
bool IsFloatNode(Node *node)
{
return dynamic_cast<FloatNode*>(node) != nullptr;
}
class GuiGenerator
{
public:
// define specific creators:
static void CreateStringGui(Node *node) { cout << "Creating String Gui" << endl; }
static void CreateIntGui(Node *node) { cout << "Creating Int Gui" << endl; }
static void CreateFloatGui(Node *node) { cout << "Creating Float Gui" << endl; }
//void Create(<Some other node>) {}
};
map<NodeType, CreateFunc> Creators =
{
{ NodeType::String, &GuiGenerator::CreateStringGui },
{ NodeType::Int, &GuiGenerator::CreateIntGui },
{ NodeType::Float, &GuiGenerator::CreateFloatGui }
};
NodeType GetType(Node *node)
{
vector<pair<NodeType, TypeFunc>> types =
{
{ NodeType::String, &IsStringNode },
{ NodeType::Int, &IsIntNode },
{ NodeType::Float, &IsFloatNode }
};
for(auto &a : types)
if(a.second(node))
return a.first;
return NodeType::Unknown;
}
// And here is it: your simplified function
//
static void CreateGUI(Node *node)
{
auto type = GetType(node);
Creators[type](node);
}
И вы можете использовать это так:
Node *node1 = new StringNode();
Node *node2 = new IntNode();
Node *node3 = new FloatNode();
CreateGUI(node1);
CreateGUI(node2);
CreateGUI(node3);
Для упрощения не предусмотрена обработка ошибок.