オーバーテクノロジー:How to know which functhion is actually called among Overloaded Function set at the Compilation Time?
#cplusplus 適当な引数の型の列(例えば int, int)と関数名(例えば f)が与えられた時に overload set の中から実際にはどの関数が呼び出されるのかコンパイルタイムに知る方法ってないですよね?
2010-06-04 22:15:50decltypeとststic_castを組み合わせればできそう RT @yak_ex #cplusplus 適当な引数の型の列(例えば int, int)と関数名(例えば f)が与えられた時に overload set の中から実際にはどの関数が呼び出されるのかコンパイルタイム
2010-06-04 22:23:45@kikairoya C++03 では無理ですか?確かに色々模索してる時に decltype あればもうちょい頑張れそうという気はしたんですが。単純に decltype(f(int(),int())) だと戻り値の型しか分からないですよね?
2010-06-04 22:26:00static_cast<decltype(f(a, b)) (*)(decltype(a), decltype(b))>(&f) とかそんな感じ?
2010-06-04 22:28:48引数の型が暗黙変換されて呼び出される場合だと取れない予感。 RT @decimalbloat: static_cast<decltype(f(a, b)) (*)(decltype(a), decltype(b))>(&f) とかそんな感じ?
2010-06-04 22:32:05あ、ちなみに何か用途がある訳ではなくて 2ch の C++ 関連スレで特定のシグネチャのフリー関数が存在するか調べる方法についての質問があって、それ考えてる途中で出てきたものです。なので適当な思考実験というかそんな感じのものだと思ってもらえれば。
2010-06-04 22:36:44@yak_ex いや、関数ポインタの具体的なアドレスが欲しい場合って、だいたいアルゴリズムに渡す時じゃないですか
2010-06-04 22:42:11@yak_ex そういう場合は、例えば int 2つ取るなら []( int a, int b ) { return f( a, b ); } って書けばいいし、そうやって書いたラムダ式は関数ポインタに暗黙変換できますし。
2010-06-04 22:43:07ラムダ式 []( T1 a, T2 b ) -> R { /* ... */ } は R (*)(T1, T2) に暗黙変換出来ます。
2010-06-04 22:45:11@SubaruG 確かにそのユースケースだと labmda でくるめば余計な事考えずに済みますね。ただ、元々の質問では特定の関数の有無によって何かの挙動を切り替えたかったんじゃないかと。
2010-06-04 22:48:02@SubaruG http://bit.ly/dgorGP (2chム板)の「メンバでない関数 namespace x{ r f(a1,a2,...); } が存在するかどうか調べることってできる?」から自分の脳内で派生した問いだったので。http://bit.ly/bXEQSJ
2010-06-04 22:56:14@yak_ex 単純には無理なので、キモい黒魔術使うくらいなら普通にメタプログラミング(mplだけじゃなく)した方が楽ですね。
2010-06-04 22:58:12