我在 cppreference.com 上找到了这个代码。我想知道 boost 是否为其变体类型提供了类似的功能。我发现 boost 文档真的很糟糕,找不到任何东西。
int main()
{
std::variant<int, std::string> v = "abc";
std::cout << std::boolalpha
<< "variant holds int? "
<< std::holds_alternative<int>(v) << '\n'
<< "variant holds string? "
<< std::holds_alternative<std::string>(v) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
虽然不完全相同,但您可以使用基于指针的get函数:
boost::variant<int, std::string> v = "abc";
std::cout << std::boolalpha
<< "variant holds int? "
<< (boost::get<int>(&v) != nullptr) << '\n'
<< "variant holds string? "
<< (boost::get<std::string>(&v) != nullptr) << '\n';
Run Code Online (Sandbox Code Playgroud)
您可以创建一个简单的包装器,其工作方式与标准包装器一样。使用具有多个重载的事实boost::get,并且当传递指针时,它还将返回一个(可能为空)指针。
template <typename T, typename... Ts>
bool holds_alternative(const boost::variant<Ts...>& v) noexcept
{
return boost::get<T>(&v) != nullptr;
}
Run Code Online (Sandbox Code Playgroud)
ADL 也会拾取它,因此将其放在哪里并不重要。
不,但是,您可以使用以下type()方法:
#include <iostream>
#include <boost/variant.hpp>
int main()
{
boost::variant<int, std::string> v = "abc";
std::cout << std::boolalpha
<< "variant holds int? "
<< (v.type() == typeid(int)) << '\n'
<< "variant holds string? "
<< (v.type() == typeid(std::string)) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
但是它不会boost::variant<int, int, std::string>像 std::holds_alternative 那样保护您免受两次相同的类型 ( ) 的影响。
| 归档时间: |
|
| 查看次数: |
1457 次 |
| 最近记录: |