如果我将T
放入std::any
,我可以使用any_cast<T>(my_any)
获取该any_cast<T>(optional<any> oa)
。但标准(= C ++ 17,目前在选票阶段)是否包含像nullopt
这样的函数,如果o为nullopt
则返回std::any_cast<T>(oa.value())
,否则返回/* using magic here to select between boost/std::experimental/std versions */
template<typename T>
inline const optional<T> any_cast(const optional<any>& operand)
{
return operand ?
optional<T>(any_cast<T>(operand.value())) :
optional<T>(nullopt);
}
?或者沿着这些方向做什么?
编辑:由于人们似乎在建议实施,我还会列出我现在使用的内容:
@response = Elasticsearch::Model.search query: {
"indices": {
"indices": [
"shares",
"rents"
],
"sort": {
"create_at": {
"order": "desc"
}
},
"query": {
"multi_match": {
"query": "Apartament",
"fields": [ "tipe"]
}
}
}
}
答案 0 :(得分:1)
在std::optional
proposal或std::any
proposal中没有提及类似的内容。
我认为使用continuation函数实现是微不足道的,因为返回类型根据可选对象的状态而有所不同:
std::optional
在适当的位置添加template <typename T, typename TOptional, typename TF>
void any_cast_or_nullopt(TOptional&& o, TF&& f)
{
if(!o) return;
f(std::any_cast<T>(*o));
}
和/或 SFINAE 以约束该功能。还应根据static_assert
的值类别转发值*o
。用法示例:
o
答案 1 :(得分:0)
如果public function getUnreadNotification(User $user): array
{
return $this->createQueryBuilder('n')
->join('n.seenBy', 'ns')
->where('ns.id IS NULL')
->orderBy('n.created', 'desc')
->getQuery()
->getResult();
}
有一个std::optional
(或and_then
)成员函数(即bind
上的一个函数,它接受optional<T>
并调用它或者返回T -> optional<U>
),那就是你要找的东西:
nullopt
或者,如果你真的想直接调用std::optional<std::any>> oa;
optional<T> opt_t = oa.bind([](std::any& v) -> std::optional<T> {
if (T* t = std::any_cast<T>(&v)) {
return *t;
}
else {
return std::nullopt;
}
});
并处理投掷,any_cast<T>
:
map
optional<T> opt_t = oa.map([](std::any& v) {
return std::any_cast<T>(v);
});
没有连续函数,所以你必须把它们写成非成员函数。