FB::Variant类
支持的类型:
long: 没有int类型,因为IE发送long类型,允许使用int类型,但是会造成数据丢失并且没有警告。
double: 任何来自浏览器的浮点数都会作为double类型返回
bool: javascript中的boolean值被转换为C++中的bool
std::string: 无UNICODE
std::wstring: UNICODE支持
FB::JSObjectPtr: 任何来自js的对象或方法都可以被转换为一个FB::JSObject,实际是通过boost::shared_ptr<JSObject>
FB::JSAPIPtr: 通常是你在C++中创建的FB::JSAPI指针,JSAPI就是个例子。 不会来自浏览器,只会传给浏览器。
std::vector<type>: 任何js数组对象都可以转换成一个vector如果type被支持。
std::map<std::string, type>:任何js对象都可以被转换成一个以string类型为索引的map,前提如果type被支持。
FB::VariantList: typedef for std::vector<FB::variant>
FB::VariantMap: typedef for std::map<std::string, std::variant>
FB::CatchAll: 通常是JSAPIAuto类中方法的最后一个参数,这样就能catch0个或多个参数,即除了前面参数剩下的参数。
CatchAll基本上是std::vector<FB::variant>的一个实际应用。
//使用CatchAll来取得参数
//某函数
void Func(long a, double b, FB:CatchAll& args)
{
//codes
}
//..
const FB::VariantList& values = args.value; //取得除了a,b以外的所有参数
std::string str = values[0].convert_case<std::string>(); //取CatchAl中第一个参数
//.. 下同
/
bool is_of_type() const
eg.
std::string str = "foo";
FB::variant var(str);
assert(var.is_of_type<std::string>());
//\
const std::type_info& get_type() const
返回数据的类型信息
eg.
std::string str = "foo";
FB::variant var(str);
assert(var.get_type() == typeid(std::string));
//
const T& convert_cast() const
继承自cast(),转换为容器类型
成功返回数据的常引用
失败扔出FB::bad_variant_cast
///
const T& cast()
成功返回数据的常引用
失败扔出FB::bad_variant_cast
/
bool empty() const
如果变量没有任何数据则返回true,否则返回false
///
void reset()
如果为空empty()为真,则无操作
如果不为空,数据释放
操作后,empty()为真
eg.
FB::variant var(12);
try
{
long a = var.convert_cast<long>();
std::string str = var.convert_cast<std::string>();
}
catch (FB::bad_variant_cast& e)
{
std::cerr << "转换异常:" << e.what();
}
std::string str2("hi");
FB::variant var2(str2);
assert(var2.get_type() == typeid(std::string));
//....
/
/
/
/
/
/
/
FB::VariantList类
这个类是FB:variant的容器,太支持使用索引随机访问。
/
variant_list_of()
头文件: variant_list.h
//----------------------------
相关类型:
FB::detail::VariantListInserter
包括一个新的FB::VariantList
支持通过括号"()"运算符来插入
可以通过操作符FB::VariantList&()来转换成FB::VariantList
eg.
FB::VariantList vars = FB::variant_list_of(1)("2")(3.4);
FireEvent(""eventName", FB::variant_list_of(5));
/
make_variant_list()
头文件:variant_list.h
make_variant_list()允许你从STL类型容器创建新的{FB::VariantList}s
int vals[] = {1,2,3,4,5};
std::vector<int> valVec(vals, vals+5);
FB::VariantList vars = FB::make_variant_list(valVec);
// vars contains 1,2,3,4,5 now
FB::VariantList vars2 = FB::make_variant_list(valVec.begin(), valVec.end()-1);
// vars2 now contains 1,2,3,4
FB::VariantList vars3(valVec.size());
FB::make_variant_list(valVec.begin(), valVec.end()-2, vars3.begin());
// vars3 now contains 1,2,3
/
convert_variant_list()
头文件: "variant_list.h"
该函数允许你把一个FB::VariantList转换成一个STL容器
eg.
typedef std::vector<std::string> StringVec;
FB::VariantList vars = FB::variant_list_of(1)("2")(3.0);
StringVec strings1 = FB::convert_variant_list<StringVec>(vars);
StringVec strings2 = FB::convert_variant_list<StringVec>(vars.begin(), vars.end()-1);
StringVec strings3(vars.size());
FB::convert_variant_list(vars, strings3);
StringVec strings4(vars.size()-1);
FB::convert_variant_list<std::string>(vars.begin(), vars.end()-1, strings4.begin());
/
/
/
/
/
/
/
一些建议
当要返回大量的或者数据较大的FB::variant或FB::VariantMap对象给javascript时, 可能会在传数据给浏览器时有个数据转换造成的停顿。 尽管你可以在你的插件的函数执行到底的时候检测来避免这种情况,但是js调用插件函数仍然会在较长一段时间(微观)后才能返回。
有一种替代方案来加速这个过程,那就是把返回结果对象的解析留给浏览器的JSON解析器来做。下面的例子来演示怎么完成。
#include "DOM/Window.h"
#include "json/json.h"
#include "fbjson.h"
FB::variant yourPluginAPI::aMethodThatReturnsParsedVariants()
{
// 在这里创建一个VariantMap对象
FB:VariantMap myMap;
// ...
// 获得DOM window对象引用
FB::DOM::WindowPtr window = m_host->getDOMWindow();
// 检查浏览器是否有内置的JSON解析器
if (window && window->getJSObject()->HasProperty("JSON"))
{
//把VariantMap转换成一个 Json::Value对象
Json::Value json_map = FB::variantToJsonValue(myMap);
//创建一个writer,把对象转换成字符串string
Json::FastWriter writer;
//创建一个浏览器的JSON实体的引用
FB::JSObjectPtr obj = window->getProperty<FB::JSObjectPtr>("JSON");
//返回调用parse函数的结果
return obj->Invoke("parse", FB::variant_list_of(writer.write(json_map)));
}
else
{
//没有检测到JSON解析器,返回一个FB::variant对象
return myMap;
}
}
//...