std::any::type
来自cppreference.com
| |
(C++17 起) | |
查询所含类型。
返回值
若实例非空则为所含值的 typeid,否则为 typeid(void)。
示例
示例演示有能力在编译和运行时注册新访问者的 std::any 访问者手法。
运行此代码
#include <any>
#include <functional>
#include <iomanip>
#include <iostream>
#include <type_traits>
#include <typeindex>
#include <typeinfo>
#include <unordered_map>
#include <vector>
template<class T, class F>
inline std::pair<const std::type_index, std::function<void(const std::any&)>>
to_any_visitor(const F& f)
{
return
{
std::type_index(typeid(T)),
[g = f](std::any const& a)
{
if constexpr (std::is_void_v<T>)
g();
else
g(std::any_cast<T const&>(a));
}
};
}
static std::unordered_map<std::type_index, std::function<void(const std::any&)>>
any_visitor
{
to_any_visitor<void>([] { std::cout << "{}"; }),
to_any_visitor<int>([](int x) { std::cout << x; }),
to_any_visitor<unsigned>([](unsigned x) { std::cout << x; }),
to_any_visitor<float>([](float x) { std::cout << x; }),
to_any_visitor<double>([](double x) { std::cout << x; }),
to_any_visitor<char const*>([](char const* s)
{ std::cout << std::quoted(s); }),
// ……为你的类型添加更多的处理器……
};
inline void process(const std::any& a)
{
if (const auto it = any_visitor.find(std::type_index(a.type()));
it != any_visitor.cend())
it->second(a);
else
std::cout << "未注册类型 " << std::quoted(a.type().name());
}
template<class T, class F>
inline void register_any_visitor(const F& f)
{
std::cout << "为类型 "
<< std::quoted(typeid(T).name()) << " 注册访问者\n";
any_visitor.insert(to_any_visitor<T>(f));
}
int main()
{
std::vector<std::any> va{{}, 42, 123u, 3.14159f, 2.71828, "C++17"};
for (int n{}; const std::any& a : va)
{
std::cout << (n++ ? ", " : "[");
process(a);
}
std::cout << "]\n";
process(std::any(0xFULL)); //< 反注册类型 "y"(unsigned long long)
std::cout << '\n';
register_any_visitor<unsigned long long>([](auto x)
{
std::cout << std::hex << std::showbase << x;
});
process(std::any(0xFULL)); //< OK: 0xf
std::cout << '\n';
}
可能的输出:
[{}, 42, 123, 3.14159, 2.71828, "C++17"]
未注册类型 "y"
为类型 "y" 注册访问者
0xf
参阅
(C++11) |
对 type_info 对象的包装,用作关联容器和无序关联容器的索引 (类) |