オーバーテクノロジー:How to know which functhion is actually called among Overloaded Function set at the Compilation Time?

真夜中に、闇のC++erはおそろしいサバトを開催していたようです…
5
Yak! @yak_ex

#cplusplus 適当な引数の型の列(例えば int, int)と関数名(例えば f)が与えられた時に overload set の中から実際にはどの関数が呼び出されるのかコンパイルタイムに知る方法ってないですよね?

2010-06-04 22:15:50
でちまるさん(実際かわいい) @decimalbloat

decltypeとststic_castを組み合わせればできそう RT @yak_ex #cplusplus 適当な引数の型の列(例えば int, int)と関数名(例えば f)が与えられた時に overload set の中から実際にはどの関数が呼び出されるのかコンパイルタイム

2010-06-04 22:23:45
Yak! @yak_ex

@kikairoya C++03 では無理ですか?確かに色々模索してる時に decltype あればもうちょい頑張れそうという気はしたんですが。単純に decltype(f(int(),int())) だと戻り値の型しか分からないですよね?

2010-06-04 22:26:00
でちまるさん(実際かわいい) @decimalbloat

static_cast<decltype(f(a, b)) (*)(decltype(a), decltype(b))>(&f) とかそんな感じ?

2010-06-04 22:28:48
でちまるさん(実際かわいい) @decimalbloat

C++03ならdecltypeの代わりにBoost.Typeofを使えば…

2010-06-04 22:31:51
Yak! @yak_ex

引数の型が暗黙変換されて呼び出される場合だと取れない予感。 RT @decimalbloat: static_cast<decltype(f(a, b)) (*)(decltype(a), decltype(b))>(&f) とかそんな感じ?

2010-06-04 22:32:05
普通のC++使い、銀天すばる @SubaruG

ってーかC++0xのラムダ式って多相じゃないのが痛すぎるにゃー。理由は分かるけどけど

2010-06-04 22:36:10
Yak! @yak_ex

あ、ちなみに何か用途がある訳ではなくて 2ch の C++ 関連スレで特定のシグネチャのフリー関数が存在するか調べる方法についての質問があって、それ考えてる途中で出てきたものです。なので適当な思考実験というかそんな感じのものだと思ってもらえれば。

2010-06-04 22:36:44
普通のC++使い、銀天すばる @SubaruG

@yak_ex 実用上はラムダ式でくるんでしまえばおkだと思いますね。

2010-06-04 22:37:47
普通のC++使い、銀天すばる @SubaruG

関数ポインタは嫌いだ…。ADLが使えないし。

2010-06-04 22:39:21
Yak! @yak_ex

@SubaruG もうちょいヒントくだしあ…

2010-06-04 22:40:42
若年寄(もう若くない) @kikairoya

引数の型を厳密に一致させるのは難しいぞ [宮崎産を食べよう]

2010-06-04 22:42:01
普通のC++使い、銀天すばる @SubaruG

@yak_ex いや、関数ポインタの具体的なアドレスが欲しい場合って、だいたいアルゴリズムに渡す時じゃないですか

2010-06-04 22:42:11
普通のC++使い、銀天すばる @SubaruG

@yak_ex そういう場合は、例えば int 2つ取るなら []( int a, int b ) { return f( a, b ); } って書けばいいし、そうやって書いたラムダ式は関数ポインタに暗黙変換できますし。

2010-06-04 22:43:07
若年寄(もう若くない) @kikairoya

あーauto使えばできるか? [宮崎産を食べよう]

2010-06-04 22:45:02
普通のC++使い、銀天すばる @SubaruG

ラムダ式 []( T1 a, T2 b ) -> R { /* ... */ } は R (*)(T1, T2) に暗黙変換出来ます。

2010-06-04 22:45:11
普通のC++使い、銀天すばる @SubaruG

…相変わらず関数ポインタの型名は構文がキモいなぁ。

2010-06-04 22:46:10
Yak! @yak_ex

@SubaruG 確かにそのユースケースだと labmda でくるめば余計な事考えずに済みますね。ただ、元々の質問では特定の関数の有無によって何かの挙動を切り替えたかったんじゃないかと。

2010-06-04 22:48:02
Yak! @yak_ex

@SubaruG メンバへのポインタはさらにキモイ気がします。R T::*

2010-06-04 22:49:05
普通のC++使い、銀天すばる @SubaruG

decltype で SFINAE って出来るんだろうか。

2010-06-04 22:55:46
Yak! @yak_ex

@SubaruG http://bit.ly/dgorGP (2chム板)の「メンバでない関数 namespace x{ r f(a1,a2,...); } が存在するかどうか調べることってできる?」から自分の脳内で派生した問いだったので。http://bit.ly/bXEQSJ

2010-06-04 22:56:14
普通のC++使い、銀天すばる @SubaruG

@yak_ex 単純には無理なので、キモい黒魔術使うくらいなら普通にメタプログラミング(mplだけじゃなく)した方が楽ですね。

2010-06-04 22:58:12
1 ・・ 6 次へ