2016-10-12 3 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

관련 구식 va_stuff? – WhozCraig

+0

C-ellipsis의 경우,'printf' has가 대응하는'vprintf'이므로'va_list'를 전달할 변형이 있습니다. C++의 경우 variadic 템플릿 만 사용하십시오. – 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) ...) {} 
}; 

예 : 당신은 C++ 대신 가변 인자 템플릿 인수를 사용 시도했다

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

DEMO

+0

printf를 사용하기 위해 가변 인수 목록을 요구했습니다. 가변 인자 템플릿을 사용하여 C++에서 printf와 같은 함수를 구현하는 것이 가능하다는 것을 알고 있지만 하나도 찾지 못했습니다 ... – user3384414

+0

죄송합니다. 추가해야합니다 ... 지금 당장하고 있습니다. .. done :-) – davidhigh

관련 문제