我必须编写一个将数据导出为各种格式的库。每种格式都是给定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-code构建一个类型动态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
的频率,或者他是否会使用宏。
有没有人知道如何实现这样的宏或类似的东西?