-4

私は を使用し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...それは何ですか? そして、この「キャスト」操作を修正するにはどうすればよいですか?

4

1 に答える 1