boost::any_cast 和 std::optional 的
boost::any_cast and std::optional's
我使用 boost::any
,并且有一些函数可以检索这样的值,但可能会失败,所以它实际上是 returns std::optional<boost::any>
(好吧,现在是 std::experimental::optional
).现在,没有可选的,我使用 boost::any_cast(my_retrieved_any)
取回我输入的值。为了处理可选的情况,我写了以下内容:
template<typename ValueType>
inline const optional<ValueType> boost_any_cast(const optional<boost::any>& operand)
{
return operand ? boost::any_cast(operand.value()) : nullopt;
}
但这无法编译(使用 Boost 1.58 和 GCC 4.9.3)。我得到:
/file.cpp(12): error: no instance of overloaded function "boost::any_cast"
matches the argument list
argument types are: (const boost::any)
这怎么可能?为什么参数不是 boost::any&
?我尝试将变量设置为 operand.value(),然后将其传递给 any_cast - 但这似乎也无济于事:
template<typename ValueType>
inline const optional<ValueType> boost_any_cast(const optional<boost::any>& operand)
{
if (operand) {
boost::any x(operand.value());
return boost::any_cast(x);
}
return nullopt;
}
这让我:
/file.cpp(13): error: no instance of overloaded function "boost::any_cast"
matches the argument list
argument types are: (boost::any)
关于 boost::any
一定有什么我没有考虑到的……是什么?我该如何解决这个 "casting" 操作?
boost::any_cast
需要模板参数;
template<typename T> T any_cast(const any &);
从您的代码片段中,您可能需要;
boost::any_cast<ValueType>(operand.value())
我使用 boost::any
,并且有一些函数可以检索这样的值,但可能会失败,所以它实际上是 returns std::optional<boost::any>
(好吧,现在是 std::experimental::optional
).现在,没有可选的,我使用 boost::any_cast(my_retrieved_any)
取回我输入的值。为了处理可选的情况,我写了以下内容:
template<typename ValueType>
inline const optional<ValueType> boost_any_cast(const optional<boost::any>& operand)
{
return operand ? boost::any_cast(operand.value()) : nullopt;
}
但这无法编译(使用 Boost 1.58 和 GCC 4.9.3)。我得到:
/file.cpp(12): error: no instance of overloaded function "boost::any_cast"
matches the argument list
argument types are: (const boost::any)
这怎么可能?为什么参数不是 boost::any&
?我尝试将变量设置为 operand.value(),然后将其传递给 any_cast - 但这似乎也无济于事:
template<typename ValueType>
inline const optional<ValueType> boost_any_cast(const optional<boost::any>& operand)
{
if (operand) {
boost::any x(operand.value());
return boost::any_cast(x);
}
return nullopt;
}
这让我:
/file.cpp(13): error: no instance of overloaded function "boost::any_cast"
matches the argument list
argument types are: (boost::any)
关于 boost::any
一定有什么我没有考虑到的……是什么?我该如何解决这个 "casting" 操作?
boost::any_cast
需要模板参数;
template<typename T> T any_cast(const any &);
从您的代码片段中,您可能需要;
boost::any_cast<ValueType>(operand.value())