使用boost::any是个好主意吗?
Is it a good idea to use boost::any?
我正在用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
,或者string
的list
;它只会如果你给它传递一些像图像一样的东西具有图像的接口。唯一的区别是这里的Python和c++是指在c++中,如果一个对象实现对于协议,必须通过继承对象来声明它定义协议接口的抽象基类。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 使用嵌套函数数组是个好主意吗?
- 将std::regex设置为静态的好主意吗
- 使用共享库进行变体处理是个好主意吗?
- 使用列表<Byte>不是好主意吗?
- 用C++编写多级内联函数是个好主意吗?
- 重载参数 C++ 是个好主意吗?
- 扩展 std::vector 是个好主意吗?
- 将 int32_t 键入为 int 是个好主意吗?
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 使用 QT 开发服务器应用程序是个好主意吗?(QT5)
- 用 constexpr 中的工会取代reinterpret_cast - 好主意?
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- 在哪里使用"std::valarray"是个好主意?
- std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意
- 在构造函数中循环C++是一个好主意吗?
- 重载指向集合的指针的开始/结束是否是个好主意
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- 使用 boost::p rogram_options 来解析文本文件是个好主意吗?
- 使用boost::any是个好主意吗?