any_cast与std :: any' s和std :: optional

时间:2016-10-06 14:48:50

标签: c++ optional c++-standard-library c++17 stdany

如果我将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"]
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

std::optional proposalstd::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); }); 没有连续函数,所以你必须把它们写成非成员函数。