2013-03-19 4 views
0

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_; 
}; 
+0

당신이 그것을 사용할 수 있다면'boost :: variant'가 더 좋습니다. – Pubby

+0

나는 개인적으로하지 않을 것이다; 나는'Image's 또는 그 효과가있는 계층 구조를 사용할 것입니다. –

답변

2

더 명확하게하기 위해, 코드의 가독성은 재 컴파일을 방지 할 수있는 것보다 더 중요하다.

알고리즘을 사용하려면 정적으로 입력하는 것이 좋습니다.

0

이 경우, 아니요. 그 문제에 관해서는, 당신은 실제로 이것을 파이썬에서 으로하지 않을 것입니다; 파이썬에서의 당신의 함수는 단지 어떤 객체도 취할 수 없습니다; 특정 프로토콜을 으로 구현하는 객체에서만 작동합니다. 을 float으로, 또는 liststring으로하면 함수가 파이썬에서 작동하지 않습니다. 은 이미지처럼 작동하는 것을 전달하면 에만 작동하고 이미지 인터페이스는 입니다. Python과 C++의 유일한 차이점은 C++에서 객체가 프로토콜을 구현하는 경우 프로토콜의 인터페이스를 정의한 추상 기본 클래스를 상속하여 선언해야한다는 것입니다.

+0

이것은 명백합니다. 저는 모든 유형의 객체에서 함수를 작동 시키려고하지 않습니다. XML에서 입출력 유형을 선언하고 정적 유형 지정 대신 런타임에서 구문 분석합니다. – lizarisk

관련 문제