c++ 当使用variant但使用error-invoke时,错误会发生在编译时而不是运行时的bad_variant_access

b91juud3  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(95)

如果我有一张Map

const std::map<int, std::variant<int, std::string>> m ={{1,1},{2,"asd"}};

但是如果我错误地调用了std::get<string>(m[1])而不是std::get<int>(m[1]),它将引发bad_variant_access.但这只是代码的拼写错误,所以IDE是否可以检测到它,或者某种形式的static_assert是否可以工作,因为m是一个常量(或者如果m不是常量怎么办),或者只引发编译错误?

g6ll5ycj

g6ll5ycj1#

如果它总是常量,就不需要Map,可以在编译时调度它:

#include <iostream>

template <int i>
constexpr auto m() 
{
    if constexpr (i == 1) {
        return 1;
    } else if constexpr (i == 2) {
        return "hello";
    } else {
        static_assert("Unknown index");
    }
}

int main()
{
    std::cout << m<1>() << '\n';
    std::cout << m<2>() << '\n';
}

或者,只使用元组:

#include <iostream>
#include <tuple>

int main()
{
    std::tuple tuple { 1, "hello world" };
    std::cout << std::get<0>(tuple) << '\n';
    std::cout << std::get<1>(tuple) << '\n';
}

相关问题