gpt4 book ai didi

c++ - 带有 std::any 和 std::optional 的 any_cast

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:00 25 4
gpt4 key购买 nike

如果我放一个 T进入 std::any , 我可以用 any_cast<T>(my_any) 得到它.但是标准(= C++17,目前处于投票阶段)是否包含像 any_cast<T>(optional<any> oa) 这样的函数?返回 nullopt如果 oa 是 nulloptstd::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);
}

最佳答案

std::optional proposal 中没有提到类似的内容或在 std::any proposal .

我认为使用延续函数来实现是微不足道的,因为返回类型根据可选对象的状态而不同:

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));
}

在适当的地方添加 static_assert 和/或 SFINAE 来约束函数。值 *o 也应根据 o 的值类别进行转发。用法示例:

int out = -1;

std::optional<std::any> x;
x = 10;

any_cast_or_nullopt<int>(x, [&out](int value)
{
out = value;
});

assert(out == 10);

关于c++ - 带有 std::any 和 std::optional 的 any_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39899155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com