原创 visualfc
boost::any的构造函数不支持字符数组的直接赋值,即
boost::any a1("ok"); //error
boost::any a2 = "ok"; //error
是无法编译通过的。
第一种方法是可以通过char*和std::string来进行赋值。即:
char str[] = "ok";
boost::any a1(&str[0]);
boost::any a2 = std::string("ok");
第二种方法是通过修改boost::any源代码来实现字符数组的直接赋值,实现思路是在boost::any的构造函数中将字符数组转换为字符指针, boost::any的构造函数代码如下:
template<typename ValueType>
any(const ValueType & value)
: content(new holder<ValueType>(value))
{
}
修改后代码如下:
在boost/any.hpp中需要添加 #include <boost/type_traits/decay.hpp>
template<typename ValueType>
any(const ValueType & value)
: content(new holder<boost::decay<ValueType>::type>((boost::decay<ValueType>::type)value))
{
}
现在修改后的boost::any可以支持字符数组操作,如下:
boost::any a1("ok");
boost::any a2 = "ok";
char buf[] = "ok";
boost::any a3(buf);
boost::any a4 = buf;
char * c1 = boost::any_cast<char*>(a1);
char * c2 = boost::any_cast<char*>(a2);
当然,本文的最终目的不是建议读者去修改boost::any的源代码,仅在于提供一种思路和方法以供参考。