2016-10-12 2 views
0

C++では可変引数リストをベースコンストラクタに渡すことは可能ですか?可変引数リストをC++のベースコンストラクタに渡す

基本コンストラクタのコードを派生クラスにコピーするだけで、可変引数のリストを処理することができますが、不要なコードの重複が発生します。

これは私がこれまで試したものです:

class A{ 
public: 
    A(const char * fmt,...){ 
    va_list ap; 
    va_start(ap, fmt); 
    vprintf(fmt,ap); 
    va_end(ap); 
    }; 
}; 

class B: public A{ 
public: 
    B(const char * fmt,...):A(fmt){;}; 
}; 

int main(){ 
    B("%d\n",42); 
} 

しかし、コンストラクタは、基本クラスのコンストラクタに、可変引数を渡すことはありません。

+0

関連、あなたはC++可変長テンプレート引数を使用代わりに試してみました古い学校va_stuff? – WhozCraig

+0

C-省略記号の場合、 'printf' hasは対応する' vprintf'であるので、あなたは 'va_list'を渡すバリアントを持っています。 C++の場合は、バリデーショナルテンプレートを使用してください。 – Jarod42

答えて

5

ただ、可変引数テンプレートを使用します(このCスタイルのものをドロップ):

struct A { 
    template<typename ... Args> 
    A(const char * fmt, Args&& ... args) { 
      printf(fmt,std::forward<Args>(args) ...); 
    }; 
}; 

struct B: public A { 
    template<typename ... Args> 
    B(const char * fmt, Args&& ... args) : A(fmt, std::forward<Args>(args) ...) {} 
}; 

例:

B("Print %d and %s",1,"hello"); //prints "Print 1 and hello" 

DEMO

+0

私はprintfを使いたいので、可変引数リストを求めていました。私はそれがvariadicテンプレートを使用してC++でprintfのような関数を(typesafetyで)実装することが可能であることを知っていますが、私は1つを見つけませんでした... – user3384414

+0

申し訳ありませんが、私はそれを追加する必要があります...私は今それをやっている。 .. done :-) – davidhigh

関連する問題