我需要为我的c ++程序制作以下功能:
当我运行它时,我输入某个功能的名称,我在我的程序中描述,并运行此功能。如何让它自动化?不像我现在的代码:
func1(){...}
func2(){...}
....
func50(){...}
int main(){
string function;
cin>>function;
if (function == "func1") funk1();
if (function == "func2") func2();
if (function == "func3") funk3();
....
return 0;
}
因为我有很多功能。我可以使用哪些乐器?
答案 0 :(得分:4)
你不能完全自动化,因为C ++没有反射。
您可以烹饪的任何其他自动化基本上与您已经拥有的非常相似。
其他一些选择是:
std::map
,密钥为std::string
,值为函数指针。std::string
为您提供正确实例的抽象工厂。答案 1 :(得分:0)
在我看来,最简单的方法是使用std::map<std::string, std::function<...> >
然后从您的函数创建一个全局地图并在地图上查找:
typedef std::function<void()> my_function;
typedef std::map<std::string, my_function> functions_map;
void test1() {...}
void test2() {...}
void test3() {...}
#ifndef _countof
# define _countof(array) ( sizeof(array) / sizeof(array[0]) )
std::pair<std::string, my_function> pFunctions[] = {
std::make_pair( "test1", my_function(&test1) ),
std::make_pair( "test2", my_function(&test2) ),
std::make_pair( "test3", my_function(&test3) )
};
functions_map mapFunctions( pFunctions, pFunctions + _countof(pFunctions) );
void main() {
std::string fn;
while( std::cin >> fn ) {
auto i = mapFunctions.find( fn );
if( i != mapFunctions.end() )
i->second();
else
std::cout << "Invalid function name" << std::endl;
}
}
答案 2 :(得分:0)
如其他解决方案中所述,可以使用从函数名称到函数指针的映射来获取函数指针。通过使用宏,可以非常接近您的意图(无需手动填充地图)。最后,您的代码将类似于此:
DECLARE_FUNC(f1)
{
std::cout << "calling f1" << std::endl;
}
DECLARE_FUNC(f2)
{
std::cout << "calling f2" << std::endl;
}
// ... more functions
int main()
{
std::string function;
std::cin >> function;
TFunc f = s_funcs[function]; // get function pointer for name
if (f)
f();
// ...
为了能够这样做,您需要以下定义:
#include <map>
#include <string>
#include <iostream>
// the common type of all functions
typedef void (*TFunc)(void);
// a static map of name -> function
static std::map<std::string, TFunc> s_funcs;
// this class we need to statically add functions to the map
class FuncAdder
{
public:
FuncAdder(std::string name, TFunc f)
{
s_funcs[name] = f;
}
};
// finally the macro for declaring + adding + defining your function
#define DECLARE_FUNC(f) void f(); FuncAdder f##Adder(#f,f); void f()