C++에서 몇 가지 이미지 처리 알고리즘을 개발 중입니다. 내 코드를 좀 더 일반화하고 전체 프로젝트를 다시 컴파일하지 않고 모든 것을 구성 할 수 있도록 처리 알고리즘을 작은 부분 ("추출자")으로 분할하고 단일 인터페이스에서 상속 된 객체로 만들고 팩토리 메소드로 구문 분석 된 XML 파일에서 실행 순서와 매개 변수를 구성하십시오. 그러나 이러한 기본적인 처리 블록의 입력 및 출력 형식은 다를 수 있습니다, 그래서 나는 이렇게 이미지와 모든 모든 작업의 모습, 일반화 된 형식으로 부스트 :: 하나를 사용하는 방법에 대한 생각 : 저장해야boost :: any를 사용하는 것이 좋은가요?
boost::any Process(const boost::any& feature);
모든 개체 내부에서 적절한 입력 및 출력 유형을 지정하고 실행될 때마다 boxing-unboxing을 수행합니다. 그런 기법을 사용하는 것이 좋은 생각입니까? 내 요구 사항을 충족시키고 Python에서 매우 자연스럽지 만 동시에 C++에서 본질적으로 정적 유형 인 해킹 해 보이는 것처럼 보이므로 사용하지 않으면 의심 스럽습니다.
UPD : 약간의 예는 대부분의 경우
// Base class for all processing
template <typename Input, typename Output>
class Processor {
public:
virtual ~Processor();
virtual Output Process(const Input& input) const = 0;
};
// Generalized type-erased processor
typedef Processor<boost::any, boost::any> TypeErasedProcessor;
// Boxing-unboxing wrapper
template <typename Input, typename Output>
class ProcessorWrapper: public TypeErasedProcessor {
public:
boost::any Process(const boost::any& boxed_input) const {
Input input = boost::any_cast<Input>(boxed_input);
Output output = processor_->Process(input);
boost::any boxed_output = output;
return boxed_output;
}
private:
std::shared_ptr<Processor<Input, Output>> processor_;
};
class SimpleImageProcessingChain: public TypeErasedProcessor {
public:
boost::any Process(const boost::any& input) const {
boost::any result = input;
for (const auto& processor: processors_) {
result = processor->Process(result);
}
return result;
}
private:
std::vector<std::shared_ptr<TypeErasedProcessor>> processors_;
};
당신이 그것을 사용할 수 있다면'boost :: variant'가 더 좋습니다. – Pubby
나는 개인적으로하지 않을 것이다; 나는'Image's 또는 그 효과가있는 계층 구조를 사용할 것입니다. –