struct D {
virtual void operator() {...};
}
struct D1 : public D {
virtual void operator() {...};
}
struct D2 : public D {
virtual void operator() {...};
}
void foo(D &d) {...};
을 그리고이 멋지게 잘, 그리고 내 D의의 수명주기 제어 :
foo(D());
foo(D1());
foo(D2());
을하지만 내 D 변형을 선택 여러 곳에서 간단한 공장을 원합니다.
const D& make_D()
{
// BAD, returning reference to temporary
if(is_tuesday())
return D1();
return D2();
}
임시 참조를 반환하는 대신 obje를 반환 할 수 있습니다. CT하지만 기본 클래스로 슬라이스합니다. 또는 공장에서 포인터를 반환 할 수 있지만 클라이언트가 포인터를 삭제해야합니다. 다른보다 복잡한 솔루션은 클라이언트에 더 많은 부하를 부과합니다.
D& d = make_D();
foo(d);
(또는 foo(make_D())
) 같은 것을 쓸 수있는 방법이 있나요? 목표는 다양한 D 정의와 make_D()
에서 복잡성을 감싸서 foo()
과 같은 함수와 그 함수를 호출하는 함수가 걱정할 필요가 없도록하는 것입니다.
참고 : 임시가 비 const 값 참조에 바인딩 될 수 없기 때문에'foo (D())'는 컴파일되지 않습니다 (컴파일러가 아닌 컴파일러는 비표준 동작에 대한 경고를 내 보냅니다). . –