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

标签 c++ boost boost-variant

我有这个代码:

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() (无一异常(exception),因为它的性能成本非常高)?

最佳答案

一般来说你不能。

如果您知道类型索引,您可以 - 或许 - 使用 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;
}

查看 Live On Coliru

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#'   

关于c++ - 当 what() != T 时,如何使 boost::variant 返回 T(),或者如何检查 T==what()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26952116/

相关文章:

c++ - Opengl 照明照亮了错误的表面

c++ - 是大括号可构造的类型特征

c++ - boost 变体 : How can I do a visitor that returns the type that was set?

c++ - 如何修改boost::apply_visitor返回值?

c++ - 在 vector 中保留插入元素的地址(C++)

c++ - 我将如何获取代码以检测多个期间(又称AKA)。

c++ - 这个包含可变大小数组的 C++ 类是否使用动态内存分配?

c++ - boost python链接

c++ - 在 C++ 中将日期转换为以毫秒为单位的时间?

windows - 在没有 MASK 的情况下使用 MinGW W64 构建 Boost