我正在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_;
};
'boost :: variant'更好,如果你可以使用它。 – Pubby 2013-03-19 19:27:06
我不會親自;我會使用'Image'的層次結構或其他效果。 – 2013-03-19 19:29:47