2013-03-19 123 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

相关问题