2

可変長パラメーター関数では、「...」を最後に配置する必要があります。また、デフォルト値が有効なパラメーターも最後にある必要があります。

では、同じ 1 つの関数で必要な両方についてはどうでしょうか。

これで、「logLevel」に従ってログを出力していた void MyPrint(int32_t logLevel, const char *format, ...) というログ ユーティリティができました。

ただし、「logLevel」を必要とせずに、MyPrint("Log test number%d", number) として使用できることを願っています。

質問: デフォルトの引数と可変個引数関数 は役に立ちませんでした。

4

1 に答える 1

1

特定のケースでは、次のように MyPrint の 2 つのバージョンを作成するだけでよい場合があります。

MyPrint(const char *format, ...)
{
    _logLevel = 1;
    // stuff
}
MyPrint(int32_t logLevel, const char *format, ...)
{
    _logLevel = logLevel;
    //stuff
}

一方、名前付きパラメーターのイディオムは実際に代替ソリューションを提供します。

class Abc
{
public:
MyPrint(const char *format, ...)
{
    _logLevel = 1;
    // stuff
}
Abc &setLogLevel(int32_t logLevel)
{
    _logLevel = logLevel;
}

// stuff

};

したがって、次のように MyPrint() を呼び出すことができます。

MyPrint("blah,blah", 123);

またはこのように:

MyPrint("blah,blah", 123).setLogLevel(5);
于 2013-05-02T08:37:37.807 に答える