boost :: any_cast和std :: optional' s

时间:2016-06-17 09:17:10

标签: c++ optional boost-any

我使用boost::any,并且有一些函数可以检索这样的值,但可能会失败,所以它实际上会返回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来说,我必须考虑一些事情......它是什么?我怎样才能解决这个问题&#34; cast&#34;操作

1 个答案:

答案 0 :(得分:3)

boost::any_cast需要模板参数;

template<typename T> T any_cast(const any &);

从您的代码段开始,您可能需要;

boost::any_cast<ValueType>(operand.value())