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

Is it a good idea to use boost::any?

本文关键字:好主意 boost any 使用      更新时间:2023-10-16

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

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

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

如果我要使用你的算法,我绝对希望它们是静态类型的。

在这种情况下,没有。就此而言,你不会真的这么做在Python中;Python中的函数不能取任意值对象;它只适用于实现一个特定的协议。你的函数在Python中不能工作给它一个float,或者stringlist;它只会如果你给它传递一些像图像一样的东西具有图像的接口。唯一的区别是这里的Python和c++是指在c++中,如果一个对象实现对于协议,必须通过继承对象来声明它定义协议接口的抽象基类。