2016-06-08 3 views
0

나는 다음과 같은 코드 조각이 : 방법과 다형성 클래스가 print라는 컴파일 시간을 정의호기심 반복 템플릿 패턴

#include <iostream> 

template <typename Derived> 
struct Base { 
    void print() const { static_cast<const Derived*>(this)->print(); } 
}; 

struct Value : public Base<Value> { 
    int i; 
    void print() const { std::cout << "Value: " << i << std::endl; } 
    Value(int j) : i(j) {} 
}; 

void do_variadic_thing() {} 

template <typename Derived, typename... Args> 
void do_variadic_thing(const Base<Derived>& b, Args... args) { 
    std::cout << "Inside do_variadic_thing" << std::endl; 
    b.print(); 
    do_variadic_thing(args...); 
} 

template <typename Derived> 
void do_thing(const Base<Derived>& b) { 
    std::cout << "Inside do_thing" << std::endl; 
    b.print(); 
    do_variadic_thing(b, b, b); 
} 

int main(int argc, char** argv) { 
    do_thing(Value(1)); 
} 

이 코드가 사용하는 호기심 반복 템플릿 패턴.

가변 수의 인수 (do_variadic_thing)가있는 함수에서 print 메서드를 실행하면됩니다. 코드는 컴파일 위에 제공하지만, 이상한 출력이 생성

Inside do_thing 
Value: 1 
Inside do_variadic_thing 
Value: 1 
Inside do_variadic_thing 
Value: 4206337 
Inside do_variadic_thing 
Value: 4206337 

값이 do_variadic_thing 내에서 두 번째 재귀 호출 후 변경 내용을 인쇄 왜 이해가 안가. 인수 b은 3 번 복제됩니다. 그 유형도 동일합니다 (예 : Base<Value>). 두 번째 호출 후에 인수가 더 이상 유효한 메모리를 참조하지 않는 것 같습니다.

어떻게 가능합니까?

답변

3

패스 :

void do_variadic_thing(const Base<Derived>& b, const Args&... args) 
                 ^
                 here 
+0

고맙습니다. 참조 b가 실제로 가변 부분에 대해 _copy_로 전달되었다는 사실을 놓쳤습니다. – madmann91

1

두 번째/세 번째 인스턴스 을 값으로 전달 중입니다. 복사본 구성 방법을 고려하십시오. 참조로

+1

또한 'Base '은'값 '이 아니며'i '필드를 포함하지 않습니다 (이 문제를'개체 조각 '이라고 함). – kennytm

0

가변 b의 유형 Base<Value> const&이지만 객체가 지칭 Value 형이다. b을 복사하여 do_thing 안에 복사하면 입니다. 즉, Base<Value> 부분 만 복사합니다.