有没有办法避免在函数重定向中使用if和硬编码字符串,想法是接收一个字符串并调用apropiate函数,可能使用模板/元编程...
#include <string>
#include <iostream>
void account()
{
std::cout << "accout method" << std::endl;
}
void status()
{
std::cout << "status method" << std::endl;
}
void redirect(std::string method_to_call)
{
if(method_to_call == "account")
{
account();
}
else if(method_to_call == "status")
{
status();
}
else
{
std::cout << "method not found!!" << std::endl;
}
}
int main()
{
std::string method_name;
std::cin >> method_name;
redirect(method_name);
return 0;
}
答案 0 :(得分:3)
你可以使用std :: map和std :: function来实现这一点,尽管它仍然需要一个硬编码的&#39;插入点处的字符串。
void status()
{
std::cout << "status" << std::endl;
}
void account()
{
std::cout << "account" << std::endl;
}
int main()
{
std::map< std::string, std::function<void()> > functions;
functions.emplace( "status" , status );
functions.emplace( "account", account );
std::string method_name;
std::cin >> method_name;
auto iter( functions.find( method_name ) );
if( iter != functions.end() )
{
iter->second();
}
else
{
std::cout << "Method " << method_name << " not found!!" << std::endl;
}
}
如果您愿意使用宏,那么您可以避免使用这样的额外字符串:
#define ADD_FUNCTION( map, func ) map.emplace( #func, func );
std::map< std::string, std::function< void() > > functions;
ADD_FUNCTION( functions, status );
ADD_FUNCTION( functions, account );