有一个具有任意类型属性数量的日志记录系统。属性由外部程序使用公共 API(功能模板)添加。类型是事先不知道的。打印出属性值的典型方法如下(简化):
void print(logging::attribute_value const& attr)
{
auto val = logging::extract<int>(attr);
if (val) {
std::cout << "value: " << val.get() << std::endl;
}
}
在上面的示例中,我们已经知道属性值类型是int
. 如果不知道预期的类型怎么办?当然,我可以这样写:
typedef boost::mpl::vector<int, std::string> types; // Expected types
logging::value_ref<types> val = logging::extract<types>(attr);
[..]
但是在这种情况下,我必须定义所有可能的类型并分别处理它们。
假设类型重载流操作符,有没有办法打印出(或转换为字符串)所有值,而不管它们的类型如何?
更新
以下是更多细节:
// Add new attributes with arbitrary types
template<typename T>
void addProperty(const std::string &key, T && value)
{
auto attrs = boost::log::core::get()->get_thread_attributes();
attrs.erase(key);
attrs.insert(key, boost::log::attributes::make_constant(std::move(value)));
boost::log::core::get()->set_thread_attributes(attrs);
}
和另一个应该打印属性值的函数
void printProperties()
{
const auto &attrs = boost::log::core::get()->get_thread_attributes();
for (auto const &a : attrs) {
// Print all values. Types aren't known.
}
}