주어진 클래스 Foo템플릿 유형에 기반한 C++ 템플릿 클래스 리팩토링
template <typename T>
class Foo
{
public:
...other methods..
void bar()
{
...
m_impl.doSomething();
...
}
void fun()
{
...
m_impl.doSomethingElse();
...
}
void fubar()
{
...
}
private:
T m_impl;
};
나는 T가 boost :: shared_ptr 인 상황에 맞추고 싶었다. 이 경우에는 클래스 Foo의 유일한 변경 사항은
m_impl->doSomething();
대신
m_impl.doSomething();
같은 헤더에서 FooPtr을 정의하는 결과가 발생했습니다.
template <typename T>
class FooPtr
{
public:
...other methods..
void bar()
{
...
m_pImpl->doSomething();
...
}
void fun()
{
...
m_pImpl->doSomethingElse();
...
}
void fubar()
{
...
}
private:
boost::shared_ptr<T> m_pImpl;
};
이제 접근법은 내가 Foo, 과 함께 사용하고자하는 모든 클래스에서 작동합니다. 문제는 내가 중복 코드를 많이 가지고 있고 Foo에 대해 을 변경했기 때문에 FooPtr로 보내야한다는 것입니다.
어떻게 코드를 리팩토링 할 수 있습니까? 예 : T가 boost :: shared_ptr 유형 인 경우 컴파일 타임에 결정할 수있는 방법이 있습니까? -> 연산자를 호출하는 bar 및 fun 메서드 만 전문으로 할 수 있습니까?
편집 : 지금까지 모든 답변 주셔서 감사합니다! 시간을 들여 모든 것을 처리하고 어떤 솔루션이 우리 소프트웨어에 가장 적합한 지 확인하십시오.
편집 2 : @Matthieu : 이것은
class FooImpl
{
public:
void doIt()
{
cout << "A" << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Foo<FooImpl> foo;
foo.doSomething();
return 0;
}
를 사용하고있는 테스트 코드입니다.
나는 당신의 접근법을 사용하려하지만, optional.hpp 내부에서 주장을 얻는다 : this-> is_initialized()는 실패한다. 이전에는 선택 사항을 사용 해 본 적이 없으며 테스트 코드를 추가했습니다. 내가 뭘 놓치고 있니? – Ralf
@Ralf : 기본적으로'boost :: optional'은 비어 있습니다 (널 포인터처럼). 기본값을 원하면 이니셜 라이저 목록에'impl (T())'와 같은 값을 명시 적으로 지정해야합니다 생성 된 개체. –
아, 고마워, 트릭을 했어. – Ralf