我正在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