使用boost :: any是个好主意吗?

时间:2013-03-19 19:24:30

标签: c++ architecture type-erasure boost-any

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

2 个答案:

答案 0 :(得分:2)

在大多数情况下,代码的可读性比避免重新编译更重要。

如果我使用你的算法,我肯定更喜欢将它们静态输入。

答案 1 :(得分:0)

在这种情况下,没有。就此而言,你不会真的这样做 在Python中;你在Python中的功能不能只带任何东西 宾语;它只适用于实现的对象 特定的协议。如果你的功能在Python中不起作用 你传递floatlist string;它只会 如果你传递的东西就像一个像图像的东西,那么就可以了 有图像的界面。唯一的区别 Python和C ++就是在C ++中,如果一个对象实现的话 一个协议,它必须通过继承来声明它 抽象基类,它定义了协议的接口。