11491


マクロを用いずに可変長引数関数をラッピングする手段を教えて下さい。  
How to wrap variadic function without macro.

DebugPrint関数がラッピング対象の関数で可変長引数を取るとします。  
DebugPrintWrapper関数がラッピングする関数で、同様に可変長引数を取るとします。

DebugPrintWrapperが受け取った可変長引数をそのままDebugPrintの引数として利用するにはどのようにすればいいでしょうか？

[code]

    void DebugPrint(const char * const fmt, ...);
    void DebugPrintWrapper(const char * const fmt, ...)
    {
        //DebugPrint(fmt, ....);
    }
    
[/code]


CC BY-SA 3.0
2015-06-19T00:58:25.877
11487
2015-09-08T22:36:29.693
2015-09-08T16:12:26.767
7566
7566
question
c++
可変長引数関数のラッピング方法


use `#include <stdarg.h>` for [c](/questions/tagged/c "'c' のタグが付いた質問を表示") or
`#include <cstdarg>` for [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示")  
and implement like `vprintf`

[code]

    void VDebugPrint(const char* const fmt, va_list va) { /*<snip>*/ }
    void DebugPrint(const char* const fmt, ...) {
      va_list va;
      va_start(va, fmt);
      VDebugPrint(fmt, va);
      va_end(va);
    }
    
[/code]

ここは日本語でＯＫですけど・・・


CC BY-SA 3.0
2015-06-19T01:27:31.067
11490
2015-06-19T01:27:31.067
8589
11487
answer


C++11、またはそれ以降を使えるなら、variadic templatesを使えます。

[code]

    template <typename ... Args>
    void DebugPrintWrapper (const char * const fmt, Args const & ... args)
    {
        DebugPrint(fmt, args ...);
    }
    
[/code]

もし、C++11以降を使えないなら、`va_***`マクロ無しで任意の数の引数を取り扱う事はできません。  
ただし、 _十分な数_ の引数を持つ関数であれば取り扱えます。  
そのためには、単純に次の様に関数テンプレートを多重定義して下さい。

[code]

    template <typename A1>
    void DebugPrintWrapper (const char * const fmt, A1 const & a1)
    {
      ...
    }
    
    template <typename A1, typename A2>
    void DebugPrintWrapper (const char * const fmt, A1 const & a1, A2 const & a2)
    {
      ...
    }
    ...
    
[/code]

もちろん、たくさんの関数テンプレートを取り扱うのは、苦痛の元ですので、マクロかvariadic templatesを用いる事を勧めます。


CC BY-SA 3.0
2015-06-19T01:36:27.947
11491
2015-06-19T01:44:05.723
2015-06-19T01:44:05.723
9968
9968
11487
answer