2

短いバージョン:...最初に解析せずに、可変引数関数で 表される内容を別の関数に渡すにはどうすればよいva_listですか?

ロングバージョン:

以下は私のクラスの2つの関数です。各関数の最初の4行が同一であることに注意してください。そして、私はこのクラスに同じ最初の4行を持つ他の6つの関数を持っています。

void cyclOps::Logger::warn(char* szFile, char* szFunction, int iLine, char* szFormat, ...) {
    va_list vaArguments;
    va_start(vaArguments, szFormat);
    char szOutput[10000];
    _vsnprintf_s(szOutput, CYCLOPSSIZEOF(szOutput), _TRUNCATE, szFormat, vaArguments);
    this->log("WARNING: %s [%s - %s(%d)]", szOutput, szFile, szFunction, iLine);
}

void cyclOps::Logger::info(char* szFormat, ...) {
    va_list vaArguments;
    va_start(vaArguments, szFormat);
    char szOutput[10000];
    _vsnprintf_s(szOutput, CYCLOPSSIZEOF(szOutput), _TRUNCATE, szFormat, vaArguments);
    this->log("INFO: %s", szOutput);
}

これらの4つの同一の行を、と呼ばれる1つの関数に入れて、次のようにsummarizeVariableArguments()呼び出します...

void cyclOps::Logger::info(char* szFormat, ...) {
      std::string strOutput = this->summarizeVariableArguments(/* TBD */);
    this->log("INFO: %s", strOutput.c_str());
}

...ここで、の内容は前の2つの関数strOutputの内容と同じになりszOutputます。...しかし、パラメータを別の関数に渡すにはどうすればよいですか?

4

3 に答える 3

4

これを移植可能に行うことはできません(または、コンパイル時に、恐ろしいC ++ 2011の可変個引数テンプレートのトリックを使用して)。

実行時に可変個引数関数を呼び出したい場合は、libffiを使用することをお勧めします。

詳細は、オペレーティングシステム、コンパイラ、プロセッサ、およびABI固有です。(しかし、libffiそれらを抽象化しようとしています)。

于 2012-12-06T17:13:07.680 に答える
4

それが、完璧な転送とは+可変個引数テンプレートのすべてです。

template<typename ...Args>
void cyclOps::Logger::info(char* szFormat, Args &&...args) {
    std::string strOutput = this->summarizeVariableArguments(std::forward<Args>(args)...);
    this->log("INFO: %s", strOutput.c_str());
}
于 2012-12-06T17:34:46.100 に答える
3

va_listあなたはそのような仕事をすることを受け入れる別の関数を作ります:

void cyclOps::Logger::vLog(const char* format, va_list args)
{
    std::string logMessage = vFormat<10000>(format, args);
    // Do what you want with logMessage
}

template <size_t BufferSize>
std::string cyclOps::Logger::vFormat(const char* format, va_list args)
{
    char buffer[BufferSize];
    vsprintf(buffer, format, args);
    return std::string(buffer);
}

私は自分のプロジェクトのためにこれをMSVCとGCCでテストしました。私が言えるのは、それが私のために働くということだけです。

これが実際のです。このソリューションはC++03で機能し、C++11でも機能するはずです。

于 2012-12-06T17:33:05.807 に答える