0

我正在用 C++ 开发一些图像处理算法。为了使我的代码更通用并且能够在不重新编译整个项目的情况下配置所有内容,我想出了一个想法,将处理算法分成小部分(“提取器”),将它们作为从单个接口继承的对象和从工厂方法解析的 XML 文件中配置它们的执行顺序和参数。但是这些基本处理块的输入和输出类型可以不同,所以我考虑使用 boost::any 作为通用类型,所以每个对图像的操作看起来像:

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

每个对象都应在内部存储正确的输入和输出类型,并在每次执行时执行装箱-拆箱。使用这种技术是个好主意吗?它满足了我的需求,并且在 Python 中非常自然,但同时在 C++ 中看起来像一个丑陋的 hack,它本质上是静态类型的,所以我怀疑是否应该使用它。

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_;
};
4

2 回答 2

2

In most cases, readability of your code is more important than being able to to avoid recompiling.

If I were to work with your algorithms, I'd definitely prefer having them statically typed.

于 2013-03-19T19:30:02.327 回答
0

在这种情况下,没有。就此而言,您也不会在 Python 中真正做到这一点。你在 Python 中的函数不能只接受任何对象;它只适用于实现特定协议的对象。如果你传递 afloat或 a listof ,你的函数将无法在 Python 中工作string;仅当您向其传递行为类似于图像并具有图像界面的东西时,它才会起作用。Python 和 C++ 之间的唯一区别是,在 C++ 中,如果一个对象实现了协议,则必须通过从定义协议接口的抽象基类继承来声明它这样做。

于 2013-03-19T19:39:54.390 回答