Hazelcast Client Imap问题,而使用get()函数- c++



是否有一种方法可以在Hazelcast 5.0或更高版本中获取密钥之前知道hazelcat密钥的数据类型?

具体来说,我的c++代码是:

hazelcast::client::imap* mapInstance = hz->get_map("MapName").get().get();;
boost::optional<bool> v;
try{
v = mapInstance->get<std::string, bool>("key2get").get();
}
catch (...) {
//print something
}

如果要获取的hazelcast键是布尔值,则代码可以完美地工作。否则(例如,标记是double类型),代码将无法处理try-catch例程并崩溃。弹出窗口消息报告:"Abort()">

提前感谢您的帮助。

我刚刚意识到在您的代码示例中,您没有在hazelcast::client::imap* mapInstance = hz.get_map("MapName").get().get();行正确使用shared_ptr。您得到临时shared_ptr的原始指针,一旦您转到下一行,它可能会失效。你能把它改成:auto mapInstance = hz.get_map("MapName").get();吗?这很可能是中止的原因。正常情况下,您应该成功捕获异常与catch(...),它不应该导致中止。

c++ API是强类型的,这意味着你需要在方法模板参数上提供你期望的类型。然而,我们有一个解决方案来处理这些情况,即您可能事先不知道数据类型,或者hazelcast数据结构的值中可能有混合类型。对于这些,您可以使用特殊类型typed_data。这种特殊类型允许您访问类型信息,并根据接收到的类型做出运行时决策。您不需要使用异常处理。下面是一个示例代码(刚刚提交了一个PR代码示例):
using namespace hazelcast::client;
auto hz = hazelcast::new_client().get();
auto map = hz.get_map("map").get();
boost::optional<typed_data> the_value = map->get<std::string, typed_data>("key").get();
if (the_value) {
std::cout << "value type id is: " << the_value->get_type() << std::endl;
if (the_value->get_type().type_id == serialization::pimpl::serialization_constants::CONSTANT_TYPE_BOOLEAN) {
// we know for sure that the value is of type `bool` and we can get it with no exception
bool value = *the_value->get<bool>();
std::cout << "value is: " << value << std::endl;
}
} else {
std::cout << "value is not set" << std::endl;
}

最新更新