2

を に入れると、Tstd::any取得できますany_cast<T>(my_any)。しかし、標準 (= C++17、現時点では投票段階) には、oa がそうである場合とそうでない場合any_cast<T>(optional<any> oa)を返すような関数が含まれていますか? またはそれらの線に沿った何か?nulloptnulloptstd::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);
}
4

2 に答える 2

1

提案書にもstd::optional提案書にもそのような言及はありません。std::any

オプションオブジェクトの状態によって戻り値の型が異なるため、継続関数を使用して実装するのは簡単だと思います。

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します。の値カテゴリに応じて、値も転送する必要があります。使用例:*oo

int out = -1;

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

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

assert(out == 10);
于 2016-10-06T15:04:46.827 に答える
0

(または) メンバー関数 (つまり、を取り、それを呼び出すか返す関数)std::optionalがある場合、それが探しているものです。bindand_thenoptional<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);
});

std::optionalただし、継続関数がないため、それらを非メンバー関数として記述する必要があります。

于 2016-10-06T15:04:45.480 に答える