5

次のように定義されたクラスがあります

class modify_field 
{
    public:
        std::string modify(std::string str)
        {
            return str;
        }

};

この関数名をメイン関数の文字列内に格納してから呼び出す方法はありますか。これを試しましたが、うまくいきません。

int main()
{
modify_field  mf;
std::string str,str1,str2;
str = fetch_function_name(); //fetch_function_name() returns string modify
str2 = "check";
cout << str; //prints modify
str1 = str + "(" +str2 + ")";
mf.str1(); 
}

私はこれが間違っていることを知っています。しかし、変数を使用して関数名を呼び出す方法があるかどうかを知りたいだけです。

4

6 に答える 6

7

これは、C++ では直接可能ではありません。C++ はコンパイル済み言語であるため、関数と変数の名前は実行可能ファイルには存在しません。したがって、コードが文字列を関数の名前に関連付ける方法はありません。

関数ポインターを使用して同様の効果を得ることができますが、この場合、メンバー関数も使用しようとしているため、問題が少し複雑になります。

少し例を挙げますが、コードを書くのに 10 分を費やす前に答えを得たかったのです。

編集:ここに私が何を意味するかを示すコードがあります:

#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

class modify_field 
{
public:
    std::string modify(std::string str)
        {
            return str;
        }

    std::string reverse(std::string str)
        {
            std::reverse(str.begin(), str.end());
            return str;
        }
};


typedef std::function<std::string(modify_field&, std::string)> funcptr;


funcptr fetch_function(std::string select)
{
    if (select == "forward")
        return &modify_field::modify;
    if (select == "reverse")
        return &modify_field::reverse;
    return 0;
}



int main()
{
    modify_field mf;

    std::string example = "CAT";

    funcptr fptr = fetch_function("forward");
    std::cout << "Normal: " << fptr(mf, example) << std::endl;

    fptr = fetch_function("reverse");
    std::cout << "Reverse: " << fptr(mf, example) << std::endl;
}

もちろん、関数を に格納したい場合はmap<std::string, funcptr>、それは完全に可能です。

于 2013-08-26T10:40:50.503 に答える
1

この関数へのポインタの方が適切かもしれません。呼び出す関数を簡単に選択できます。

#include<iostream>
using namespace std;

class modify_field
{
    public:
        std::string modify_1(std::string str)
        {
            return str;
        }
        std::string modify_2(std::string str)
        {
            return str + str;
        }
};

int main()
{
    string (modify_field::* fun_ptr) (string) = &modify_field::modify_1;
    modify_field m;
    cout << (m.*fun_ptr)("test") << endl;
    fun_ptr = &modify_field::modify_2;
    cout << (m.*fun_ptr)("test") << endl;
}
于 2013-08-26T10:41:26.887 に答える
0

関数のシグネチャが同じ場合、文字列から std::function オブジェクトへのマップを作成できます。std::function の詳細については、こちらを参照してください: std::function

于 2013-08-26T10:45:06.320 に答える