C ++避免和&硬编码的字符串

时间:2017-09-09 11:21:54

标签: c++

有没有办法避免在函数重定向中使用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;
}

1 个答案:

答案 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 );