当 what() != T 时,我如何使 boost::variant 返回 T(),或者我如何检查 T==what()

How can I make boost::variant return T() when what() != T, or how do I check if T==what()?

本文关键字:what 或者 何检查 检查 返回 variant 何使 boost      更新时间:2023-10-16

我有这个代码:

std::vector<boost::variant<int,float,std::string>> data;
template<typename T> T Get(size_t i)
{
    if (i < data.size())
        return boost::get<T>(data[i]);
    return T();
}

如何检查get<T>是否失败以便return T()(无一例外,因为它的性能成本非常高)?

一般来说你不能

如果您知道类型索引,则可以 - 也许 - 对variant::which做一些脆弱的事情。

不过,可靠的方法是自己写一个访客。下面是一个概念证明:

namespace detail {
    template <typename T>
    struct get_with_default_visitor : boost::static_visitor<T> {
        T default_;
        get_with_default_visitor(T dv) : default_(dv) {}
        T const& operator()(T const& v) const { return v; }
        template <typename Other> T operator()(Other const&) const {
            return default_;
        }
    };
}
template<typename T, typename Container> T Get(Container const& data, size_t i, T defaultvalue = T())
{
    if (i < data.size())
        return boost::apply_visitor(detail::get_with_default_visitor<T>(defaultvalue), data[i]);
    else
        return defaultvalue;
}

科里鲁观看直播

int main() {
    std::vector<boost::variant<int, float, std::string> > data { 
        42, 3.14f, std::string("hello world") };
    for (int i = 0; i < 5; ++i) std::cout << Get<int>(data, i, -99) << "t";
    std::cout << "n";
    for (int i = 0; i < 5; ++i) std::cout << Get<float>(data, i, -9999e99) << "t";
    std::cout << "n";
    for (int i = 0; i < 5; ++i) std::cout << "'" << Get<std::string>(data, i, "#error#") << "'t";
    std::cout << "n";
}

印刷

42  -99 -99 -99 -99 
-inf    3.14    -inf    -inf    -inf    
'#error#'   '#error#'   'hello world'   '#error#'   '#error#'   
相关文章: