당신이 라이브러리의 내부 기본 클래스가 있다고 가정 기본 유형에 저장된 특정 파생 된 유형의 인스턴스 찾기 :벡터, 모든
class A {};
및 파생 클래스
class B: public A {};
class C: public A {};
을
은 이제 B
및 C
의 인스턴스는 표준에 저장됩니다 : 벡터를 boost::shared_ptr<A>
의 :
std::vector<boost::shared_ptr<A> > A_vec;
A_vec.push_back(boost::shared_ptr<B>(new B()));
A_vec.push_back(boost::shared_ptr<C>(new C()));
B
및 C
의 인스턴스를 추가하는 것은 사용자가 수행하므로 추가 될 순서를 미리 결정할 방법이 없습니다.
그러나, 라이브러리의 내부 B
및 C
에 특정 작업을 수행 할 필요가있을 수 있으므로 기본 클래스에 대한 포인터는 B
및 C
에 주조 될 필요가있다.
당연히 "시행 착오"전환을 수행 할 수 있습니다. 즉, 던지지 않는 전환을 찾을 때까지 B
및 C
(및 기타 기본 클래스의 파생물)으로 캐스팅을 시도 할 수 있습니다. 그러나이 방법은 매우 조잡하고 오류가 발생하기 쉽고 좀 더 우아하고 (그리고 성능이 좋은) 방법을 찾고 있습니다.
저는 C++ 98에서도 작동 할 수있는 솔루션을 찾고 있지만 기능을 향상시킬 수 있습니다.
아이디어가 있으십니까?
편집 :
오케이, 지금까지 모든 답변에 대한 감사합니다!
유스 케이스에 대해 더 자세히 설명하고 싶습니다. 이 모든 것은 파라 메트릭 최적화와 관련하여 발생합니다. (예를 들어, "제약 정수", "구속 더블", "부울"등 "이중 구속") 초기 자신의 유형, 즉
- 매개 변수를 지정 :
사용자에 의해 최적화 문제를 정의 소정의 매개 변수, 하나 개 이상의 평가 (큰 값)가 부여하는 평가 함수가
다른 최적화 알고리즘이 그들의 파라미터를 포함하여, 문제 정의 행동 설정 지정
일반적인 경우에 미리 정의 된 매개 변수 개체가 많이 있지만 사용자는 내 기본 클래스 중 하나에서 파생하여 자체 매개 변수 개체를 만들 수도 있습니다. 그래서 라이브러리 관점에서 볼 때 매개 변수 객체가 주어진 (기본 클래스) API를 준수해야한다는 것 외에도 매개 변수 객체에 대해 많이 생각할 수 없습니다.
문제 정의는 std :: vector 인터페이스가있는 기본 클래스에서 파생 된 사용자 정의 C++ 클래스입니다. 사용자는 자신의 (미리 정의되거나 자체 성장 된) 매개 변수 객체를 추가하고 적합성 기능에 과부하를줍니다.(파생 매개 변수 객체는 그 값에 대한 액세스 기능을 제공하기 위해 필요로하는, 심지어 집에서 재배 한 매개 변수 객체에 대해, 일반적으로 오케이) 파라미터 객체에
액세스는 최적화 알고리즘 내에서
- 을 발생할 수 있습니다. 사용자가 제공 한 피트니스 함수 내에서 (보통 오케이, 사용자가 컬렉션에있는 매개 변수 개체를 발견하고 그 가치를 쉽게 액세스 할 수있는 위치를 알고로)
이 잘 작동합니다. 그러나 사용자가 제 3자가 매개 변수 구조를 제공하고있다
- 특별한 경우가있을 수 있습니다
는 (이 오픈 소스 라이브러리, 다른 사람이다 특정 최적화 문제에 대한 코드를 추가 할 수 있습니다.)
- 최적화 문제의 일부로 매개 변수 구조 (즉, 매개 변수가있는 위치)가 수정 될 수 있습니다. 예 : 신경망 아키텍처의 학습
이러한 상황에서 기본 유형 모음 내부에서 지정된 파생 유형의 모든 매개 변수 객체에 액세스하는 쉬운 방법을 갖는 것이 좋습니다.
이미 템플릿이있는 "conversion_iterator"가 있습니다. 기본 객체의 벡터를 반복하고 원하는 대상 유형을 준수하지 않는 객체는 건너 뜁니다. 그러나 이것은 "시행 착오"전환 (즉, 변환 된 스마트 포인터가 NULL인지 여부를 확인)을 기반으로합니다. 이는 매우 비현실적이며 오류가 발생하기 쉽습니다.
더 나은 솔루션을 갖고 싶습니다.
NB : 최적화 라이브러리는 주어진 매개 변수 집합에 대한 평가 단계가 임의로 길어질 수있는 (일반적으로 초, 아마도 몇 시간 또는 그 이상) 유스 케이스에서 타겟팅됩니다. 따라서 매개 변수 유형에 대한 액세스 속도는 그리 중요하지 않습니다. 하지만 안정성과 유지 보수성은 ...
'가상'메소드를 제외하고, 당신은 의미합니까? – delnan