ページ 11

string型 を関数で実行するためには?

Posted: 2010年9月18日(土) 18:13
by Tororo
お久しぶりです Tororoです。

今回は、関数ポインタに近いかもしれない質問です。


このような関数の内部です。

void CTaskMap::RunTheTask()
{
map<string, string>::iterator it;
it = m_Maps->begin();
while( it != m_Maps->end() )
{

//関数名はAddObjectという関数で、
//stringと同名でmapのsecondに登録してあります

//この部分でstring型を関数みたいに使いたいのです。
        //(*it).second() のような感じです。
//実行できないのは知っていますが(笑)

it++;
}
}

#define RunTheFunc(name) (name##(##)) のような事も考えたのですが、
「引数が0個は評価できません」と出てダメなんです。

やはり、関数ポインタでしか出来ないのでしょうか?

どうやったら、実行できるかご教授お願いします。


実行環境 VC++2008 WindowsXP
画像

Re:string型 を関数で実行するためには?

Posted: 2010年9月18日(土) 20:26
by めるぽん
C++ リフレクション的なことをするには、自分の知っている限りだとマクロを駆使しないと不可能という認識なのですが、そもそも関数ポインタではダメだという理由は何かあるのでしょうか?

Re:string型 を関数で実行するためには?

Posted: 2010年9月18日(土) 21:01
by Tororo
ダメと言う訳ではなく、
関数ポインタ以外では出来ないかなと純粋に思い、
色々試してみたほうが、知識や自分のためになるかなと考えたからです。

ただ、不可能に近いのなら、関数ポインタを使用するのですけどね・・

トークン連結演算子? も、少し気になったもので><

Re:string型 を関数で実行するためには?

Posted: 2010年9月18日(土) 21:27
by めるぽん
## によるトークン連結は実行時に連結されるわけではないので、
#define CONCAT(a, b) a##b

string str1 = "Hoge";
string str2 = "Func";

CONCAT(str1, str2)
とした場合、最後の行は HogeFunc にはならず、str1str2 になります。
実行時に関数を探したりといったことはできないので、実行時に文字列で関数を呼び出す用途には使えませんね。

Re:string型 を関数で実行するためには?

Posted: 2010年9月19日(日) 07:19
by Tororo
>>めるぽんさん

知らなかったです^^;
では、

#define RunTheFunc(name) name##(##)

だと、文字列ではなく、()を直で連結していると言う解釈でよいのでしょうか?

テストした時は、これでクラス外の関数は呼び出せたのですが。。

もしかして、クラスの関数は呼び出し方が違うのでしょうか・・・

Re:string型 を関数で実行するためには?

Posted: 2010年9月19日(日) 13:01
by めるぽん
>テストした時は、これでクラス外の関数は呼び出せたのですが。。
#define によるマクロは、単なる文字列の置換なので、どこかのコード上で
RunTheFunc(Func)
と書くと
Func()
というコードに置換されます。
なので、Func という名前の関数があれば呼び出せます。

Re:string型 を関数で実行するためには?

Posted: 2010年9月19日(日) 13:43
by Tororo
>>めるぽんさん

調べたところ、クラス内での関数ポインタには使い方にルールがあるようです。

トークン連結での実行はあきらめて、関数ポインタで素直に作ろうと思います。。

ありがとうございましたm(_ _)m。