1

C++ プログラムに次の機能を追加する必要があります。

実行すると、プログラムで説明した誰かの関数の名前を入力すると、この関数が実行されます。自動にする方法は?私の現在のコードとは異なります:

func1(){...}
func2(){...}
....
func50(){...}
int main(){
    string function; 
    cin>>function;
    if (function == "func1") funk1();
    if (function == "func2") func2();
    if (function == "func3") funk3();
    ....
    return 0;
}

私は多くの機能を持っているので。どの楽器を使用できますか?

4

3 に答える 3

4

C++ にはリフレクションがないため、完全に自動化することはできません。

クックできるその他の自動化は、基本的に既に持っているものと非常に似ています。

その他のオプションは次のとおりです。

  • std::mapキー astd::stringと値 a 関数ポインターを持つ aを持ちます。
  • 内部に関数を持つ複数のクラスと、に基づいて正しいインスタンスを提供する抽象ファクトリstd::string
于 2012-10-21T12:47:24.310 に答える
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;
    }
}
于 2012-10-21T13:04:30.710 に答える
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()
于 2012-10-21T13:04:52.000 に答える