2014-04-24 2 views
1

에 생성 구성 파일 (ROS 매개 변수). 이 템플릿 클래스가 아닌 더 논리의 유형을 결정 :통화 기능 (11) 템플릿 클래스와 런타임에 결정 유형과의 인스턴스화 ++ 나 C에 대한 까다로운 질문이 실행

클래스 정의 :

전형적인 코드는
template<typename T> 
class MyClass { 
    //[...] 
} 

: (물론) 컴파일되지

/* [Read parameter and write result to bool use_int] */ 

std::unique_ptr<MyClass> myclassptr {nullptr}; 
if(use_int) { 
    myclassptr.reset(MyClass<int>); 
} else { 
    myclassptr.reset(MyClass<double>); 
} 

myclassptr->foobar(); 

/* [more code making use of myclassptr] */ 

그래서이 코드가되고, unique_ptr 템플리트가 템플리트 유형으로도 지정되어야하기 때.입니다. 그러나 reset을 사용하여 할당 된 모든 객체에 대해 템플리트 유형이 동일해야하는 문제가 발생합니다.

한 가지 추악한 해결책은 코드 myclassptr->foobar();과 다음 코드를 if/else의 각 분기로 복사하는 것입니다. 실제로는별로 좋지 않습니다.

나는이에 대한 해결책 비슷한보고 싶습니다 : 내가 지금까지 읽은 내용

/* [Read parameter and write result to bool use_int] */ 

MyClass<use_int ? int : double> myclass; 
myclass.foobar(); 

이런 일이 가능하지 않다는 것이다.

아무에게도 좋은 해결책이 있습니까?

+2

아마도 공통 기본 클래스 : 템플릿 클래스 MyClass : public IClass; – juanchopanza

+2

이것은 무엇을위한 인터페이스입니다. – Xeo

답변

3

이 작업을 수행하는 가장 간단한 방법입니다. 형식 지우기가 수행 될 수 있지만, 일반적으로 통일 된 인터페이스를 적용하려는 관련없는 유형이있을 때 다시 수행됩니다.

generics는 template과 비슷하지만 실제로는 자동 생성 된 typecasting 및 일부 typechecking이있는 추상 인터페이스입니다. C++ template은 함수 또는 클래스 컴파일 타임 팩토리입니다. 이러한 팩토리의 두 출력은 기본적으로 런타임시 관련이 없으므로 원하는 경우 이러한 관계를 추가 할 수 있습니다.

+0

멋지고 깨끗한 솔루션처럼 보입니다. 감사합니다! – franzlst

1

원하는대로 MyClass를 int 또는 double을 포함하는 변형 유형으로 만들거나 유형 삭제를 사용하여 인터페이스 뒤에 구현을 숨길 수 있습니다. Boost.Variant 라이브러리는 이전 버전을 구현하는 데 도움이 될 수 있습니다.

class IClass{ 
    virtual ~IClass {} 
    virtual void foobar()=0; 
}; 
template<typename T> 
class MyClass:public IClass { 
public: 
    void foobar() override { 
    // code here 
    } 
}; 
std::unique_ptr<IClass> myclassptr {}; 
if(use_int) { 
    myclassptr.reset(new MyClass<int>()); 
} else { 
    myclassptr.reset(new MyClass<double>()); 
} 
myclassptr->foobar(); 

boost::variant가 다른 해결책이 될 것이지만, 일반적으로 관련이없는 타입에 사용됩니다 :

+0

Boost.Variant를 사용해 주셔서 감사합니다. 기본 생성자없이 클래스를 사용하는 데 문제가있을 수 있습니다. 또한 이론을 올바르게 이해하면 호출 할 각 함수에 대한 방문자 클래스가 필요합니다. 오버 헤드 나 추가 코드가 마음에 들지 않습니다. – franzlst