2013-03-19 140 views
0

我正在C++中開發一些圖像處理算法。爲了使我的代碼更加通用化,並且能夠在不重新編譯整個項目的情況下配置所有內容,我想到了將處理算法分割成小部分(「提取器」)的想法,使它們成爲從單一接口繼承的對象,從工廠方法解析的XML文件配置它們的執行順序和參數。但是,輸入和輸出類型,這些基本的處理塊可以是不同的,所以我想到了使用boost ::任何一個廣義的類型,所以每一個與圖像的每個操作會是什麼樣子:使用boost :: any是個好主意嗎?

boost::any Process(const boost::any& feature); 

每個對象應該存儲內部正確的輸入和輸出類型,並在每次執行時執行裝箱 - 拆箱。使用這種技術是一個好主意嗎?這種方式滿足了我的需求,在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 2013-03-19 19:27:06

+0

我不會親自;我會使用'Image'的層次結構或其他效果。 – 2013-03-19 19:29:47

回答

2

在大多數情況下,你的代碼的可讀性比能夠避免重新編譯更重要。

如果我要使用你的算法,我肯定會更喜歡讓它們靜態類型化。

0

在這種情況下,沒有。對於這個問題,你不會在Python中做這個 ;你在Python中的函數不能只取任何 對象;它只會與實現 特定協議的對象一起工作。如果你通過它或liststring,你的函數將無法在Python中工作;如果 你通過它,如果通過它的行爲類似於圖像,則只有 有效,並且 具有圖像的接口。 Python和C++之間唯一的區別在於,在C++中,如果某個對象實現了協議,則必須通過從定義該協議接口的抽象基類繼承來聲明這樣做。

+0

這很明顯,我沒有試圖讓我的函數能夠處理任何類型的對象,我在XML中聲明瞭輸入/輸出類型,並在運行時解析它們而不是靜態類型。 – lizarisk 2013-03-19 20:20:36

相關問題