オーバーロードについての質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
赤鬼

オーバーロードについての質問です

#1

投稿記事 by 赤鬼 » 14年前

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する数が物凄いことになったりして無理だと思ったので何か違う方法がある(もしくは存在しない)のかなと思って質問させて頂きました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: オーバーロードについての質問です

#2

投稿記事 by h2so5 » 14年前

オーバーロードする目的はなんでしょうか。

赤鬼

Re: オーバーロードについての質問です

#3

投稿記事 by 赤鬼 » 14年前

DrawFormatStringで文字を表示するのに座標x,yをdouble型で取っているからです(この関数はx,yをint型で取るのでその警告がでてしまうのを抑えるため)。
理由としては別の計算をし、その出力の最に文字を出力する必要があり、出力する座標の計算がdouble型であること。
また、その出力する必要がある箇所が複数あるため、警告を消すためにオーバーロードが出来ればそっちの方が綺麗にまとまると考えたのでオーバーロードしてみようと思いました。
まあ、全部キャスティングすれば良い話ですが。
それとは別に単純に知識として興味があったというのもあります。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: オーバーロードについての質問です

#4

投稿記事 by h2so5 » 14年前

あまり良い方法では無いと思いますが、あえてオーバーロードするとすればこのような書き方ができます。
(試してないので動くかどうか保証できませんが)

実際には、オーバーロードせずに毎回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: オーバーロードについての質問です

#5

投稿記事 by 赤鬼 » 14年前

回答有難うございます。
なるほど、可変長引数を文字列に直してから描画する・・・と
場数踏んでいる人はすごいですね全然思い付きませんでした。

しかし、やっぱり変数ごとに静的キャストしたほうが良いんですね。
大変有難うございました、とても勉強になりました。

あ、コードはテスト時にprintfに書き直しました(一々ソリューション作るの面倒くさいので)がちゃんと動きましたので問題ありません。

閉鎖

“C言語何でも質問掲示板” へ戻る