【c++】可変長引数を取り可変長引数を渡す

c++

概要

以前、可変長引数を取る関数についてと言うエントリを書きました。

【cocos2d-x】可変長引数を取る関数について
CCLOGの様に、引数の個数をその時に応じて変えたくなる時があります。 その様な関数はどうやって作るのでしょうか? 与えられたint型の引数全てを乗算して返すメソッドmultiplyを作ってみましょう。 結論この様な形に...

そういう関数を作ったは良いけど、渡って来た引数を、他の可変長引数を取る関数にそのまま渡したい場合にはどうすれば良いのでしょうか?

可変長引数をとる関数にそのまま渡すにはどうするのか?

例えば、CCLOGやvprintf等の関数をラップする場合等です。

// HelloWorld.h
void log(const char * format,...);

// HelloWorldc.cpp
void HelloWorld::log(const char *format...)
{
    // CCLOGにこのformatと引数達を渡したい・・・。
}

まさか、渡って来た引数の個数を調べてその個数に応じて引き渡し先の関数を呼ぶ訳にもいきません。

結論この様な形になります。

void HelloWorld::log(const char *format...)
{
    va_list args;
    va_start(args, format);
    vprintf(format, args);
    va_end(args);
}

簡単ですね。

va_list型の変数を用意し、それをformatで初期化する。
そして、vprintfに可変長引数とformatを渡してあげる。

以上です。

使用例はこちら。

 this->log("これは%sです。", "みかん");

出力

これはみかんです。

型の違う引数も取る事が出来ます。

 this->log("これは%sで%d円です。", "みかん", 150);

出力

これはみかんで150円です。

誰かのお役に立てば。

【cocos2d-x】cocos記事一覧
cocos記事一覧 Pimpl 激震が走った、Pimplイディオム enum enum struct(class)とは cast 決定版!*_castまとめ sqlit...

コメント

タイトルとURLをコピーしました