ページ 1 / 1
オーバーロードについての質問です
Posted: 2012年5月22日(火) 16:28
by 赤鬼
stadio.hのpritf(_In_z_ _Printf_format_string_ const char * _Format, ...)などの引数にあ...この可変長引数を含めたオーバーロードをする方法はありますか?
ちなみにDxライブラリのDrawFormatString( int x, int y, int Color, const TCHAR *FormatString, ... ) ;をオーバーロードしようとしたときに上手くいかなかったのでヘッダを調べていたら、偶然出くわしました。
va_*のマクロを見て文字列の中から初期化指定子の個数と、引数の種類を探して
それに対応した引数をreturnしてやる方法を思いついたのですが、そうするととreturnする数が物凄いことになったりして無理だと思ったので何か違う方法がある(もしくは存在しない)のかなと思って質問させて頂きました。
Re: オーバーロードについての質問です
Posted: 2012年5月22日(火) 16:44
by h2so5
オーバーロードする目的はなんでしょうか。
Re: オーバーロードについての質問です
Posted: 2012年5月22日(火) 17:27
by 赤鬼
DrawFormatStringで文字を表示するのに座標x,yをdouble型で取っているからです(この関数はx,yをint型で取るのでその警告がでてしまうのを抑えるため)。
理由としては別の計算をし、その出力の最に文字を出力する必要があり、出力する座標の計算がdouble型であること。
また、その出力する必要がある箇所が複数あるため、警告を消すためにオーバーロードが出来ればそっちの方が綺麗にまとまると考えたのでオーバーロードしてみようと思いました。
まあ、全部キャスティングすれば良い話ですが。
それとは別に単純に知識として興味があったというのもあります。
Re: オーバーロードについての質問です
Posted: 2012年5月22日(火) 18:05
by h2so5
あまり良い方法では無いと思いますが、あえてオーバーロードするとすればこのような書き方ができます。
(試してないので動くかどうか保証できませんが)
実際には、オーバーロードせずに毎回intにキャストする方法が無難だと思いますし、僕だったらそうします。
コード:
int DrawFormatString(double x, double y, int Color, char *FormatString, ...)
{
va_list arg;
char buffer[256];
va_start(arg, FormatString);
vsprintf(buffer, FormatString, arg);
va_end(arg);
return DrawString(static_cast<int>(x), static_cast<int>(y), buffer, Color);
}
Re: オーバーロードについての質問です
Posted: 2012年5月22日(火) 22:47
by 赤鬼
回答有難うございます。
なるほど、可変長引数を文字列に直してから描画する・・・と
場数踏んでいる人はすごいですね全然思い付きませんでした。
しかし、やっぱり変数ごとに静的キャストしたほうが良いんですね。
大変有難うございました、とても勉強になりました。
あ、コードはテスト時にprintfに書き直しました(一々ソリューション作るの面倒くさいので)がちゃんと動きましたので問題ありません。