动态扩展 boost::variant 的类型
Extending types of a boost::variant dynamically
>我必须编写一个将数据导出为各种格式的库。每种格式都是给定boost::variant
的一种类型,例如
typdef boost::variant<csv, xml, hdf5> TFormat
格式为 csv、xml 和 hdf5。这种方法对我来说效果很好。该库应该非常通用,并且对客户端的可能扩展开放。因此,如果客户端能够以统一的方式添加用户定义的格式,那就太好了。
我希望 I 客户端可以添加几个宏,例如
REGISTER_FORMAT(binary)
REGISTER_FORMAT(mpeg)
之后我的typedef
神奇地变成了
typedef boost::variant<csv, xml, hdf, binary> TFormat.
我已经想出了如何使用以下 mpl 代码构造类型动态boost::variant
,幸运的是可以使用 MSVC2010 进行编译。
#include <boost/variant/variant.hpp>
#include <boost/mpl/vector.hpp>
int main() {
// Adding the type int, to a vector containing the types double and std::string
using namespace boost;
typedef mpl::vector< double, std::string > DefaultTypes;
typedef mpl::push_front< DefaultTypes, int >::type ExtendedTypes;
// typedef TFormat of type boost::variant<double, std::string, int>
typedef boost::make_variant_over< ExtendedTypes >::type TFormat;
return 0;
}
我仍然无法实现上述宏,因为事先不清楚客户端调用REGISTER_FORMAT
的频率,或者他是否会使用该宏。
有没有人知道如何实现这样的宏或类似的东西?
我希望 I 客户端可以添加几个宏,例如
这是不可能的。C 预处理器没有"堆栈",没有"变量",没有"状态"。您拥有的唯一状态是在当前所在的扩展中。您不能"保存内容以备后用",甚至不能分配任何东西。上一个宏不可能影响下一个宏。
或类似的东西?
您可以使用不同的预处理器,例如 M4,但是如果宏调用跨越多个文件集成它可能非常困难。
如前所述,您可以使用有状态模板技巧来累积类型。
相关文章:
- 更改其类型后,丢失对 std::variant 对象的引用
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 在 std::variant 中按类型获取索引
- C++获取std::variant当前帮助的类型的std::typeindex
- 如何检查 std::variant 是否可以容纳某种类型
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 具有 std::map 和 std::variant 的不完整类型
- std::bind to a std::variant 包含多个 std::函数类型
- 如何遍历 std::variant 的类型?
- 如何将当前替代类型的 std::variant 传递给可调用对象?
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- 将 std::variant 转换为另一个具有类型子集的 std::variant
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 返回类型 std::optional<std::variant<...>>
- boost::variant 当 bool 显示为可能的类型时,会给出错误的结果
- std::variant 存储多个字符串类型并区分它们
- 为什么不允许 std::variant 与其替代类型之一相等?
- 将 std::variant 转换为另一个具有超类型集的 std::variant
- 传递给 std::variant 的预定义类型列表