melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  485  : トラックバック  36

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

今まで知りませんでしたorz

普通に型さえ指定すれば取れるんですね。

 

int Func(int hoge) { return 0; }
int __stdcall Func(int hoge, int hoge2) { return 0; }

int (*pFunc)(int) = &Func;
int (__stdcall *pFunc2)(int, int) = &Func;

関数の型は書き方が特殊すぎる……。

投稿日時 : 2007年9月5日 13:38

コメント

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/05 17:35 渋木宏明(ひどり)
>関数の型は書き方が特殊すぎる……。

僕はかつて、typedef を活用して難解さを回避してました。

関数のポインタとかも難しいけど、(意図している効果を得るための)const の置き位置もかなり悩みませんか?


# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/05 19:27 melt
>typedef を活用して難解さを回避してました。
でも typedef を書くのも難解というw
まあ一度書けば終わりなので全然マシですがw

>const の置き位置もかなり悩みませんか?
とりあえず const はポインタに対して付けると後置になるって覚えてるので、ほんとに何を const にしたいかというのが自分の中で明確になってるのであれば、書くことはそんなに悩みません。
まあ、その何を const にするか考えるというのが大問題なわけですが……。

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/06 11:49 渋木宏明(ひどり)
>でも typedef を書くのも難解というw

1発(≒1行)で書くのはあきらめて、分かる範囲の定義を細かく typedef して、それの組み合わせで1行で書くと難解な定義を書いてました。

>とりあえず const はポインタに対して付けると後置になるって覚えてるので、

ポインタのポインタ辺りでもう限界っす>じぶん
これも typedef で逃げられれば逃げるパターンでした (^^;



# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/06 12:58 uskz
template <class T>
struct identity
{ typedef T type; };

identity<int(int)>::type* pFunc = &Func;
identity<int __stdcall(int, int)>::type* pFunc2 = &Func;

とか 笑
関数ポインタやらconstやらの入り混じった宣言は,文法と格闘している間に読めるようになりました.

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/06 13:04 uskz
http://d.hatena.ne.jp/uskz/20060531/p1
これとかひどい 笑

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/06 17:35 melt
>分かる範囲の定義を細かく typedef して
確かにそうした方が後から見る人のためにも良いですよねw
……でも後から見る人に「こいつこんなのも分けないと書けないのかよw」とか思われたりすると悔しいので頑張って1行で全部書いて、それをコメントアウトしてからバラバラにしますw

>template <class T>
>struct identity
>{ typedef T type; };
このテンプレートはいいですねw
名前がちゃんと後ろに行くので、typedef するときも分かりやすそうですw

http://d.hatena.ne.jp/uskz/20060531/p1
これをちゃんと読むことが出来る C コンパイラが恐ろしいw

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/06 18:14 uskz
array<add_pointer<add_pointer<void(int)>::type(int, void(int))>::type, N> af;
こういうのも富豪的プログラミングですかね 笑

identityはBoost.MPLに同じものがありますので,Boostが使える環境ならそっちを使う方が良いと思います.

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/06 20:41 melt
勘ですが、

array<add_pointer<add_pointer<void(int)>::type(int, add_pointer<void(int)>::type)>::type, N> af;

こうじゃないかなーと思いましたw

うんうん、これなら分かりやす……くねーwwwww

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/07 9:25 uskz
仮引数の配列型がポインタ型になるように,仮引数の関数型は関数ポインタになりますのでそのadd_pointerはあっても無くても大丈夫なのです.他にも関数型の仮引数の型のtop levelのcv-qualifierが無視されるだとか,この辺のルールも結構ややこしいですね.

# re: [C++]オーバーロードした関数ポインタの取り方 2007/09/07 10:21 melt
こんな複雑な仕様を実装する C++ コンパイラ屋は変態だと思います……。
そしてそれを骨の随までしゃぶり尽くして効果的な実装をする boost も変態だと思います……。

Post Feedback

タイトル
名前
Url:
コメント