gpt4 book ai didi

c++ - 是否可以从受歧视的 union 中自动提取类型?

转载 作者:行者123 更新时间:2023-11-28 06:13:17 25 4
gpt4 key购买 nike

是否可以提取可区分 union 的类型来初始化“auto”变量?将类型传递给模板很容易,但我想要“自动”的东西。使用访问者函数或使用有界类型列表(例如 mpl::vector)的解决方案会很棒。

示例如下:

#include <iostream>
#include <typeindex>
#include <cassert>

struct d_union {
template <typename T>
d_union(T t) {
*reinterpret_cast<T*>(data) = t;
_type_id = &typeid(T);
}

template <typename T>
const T* get_pointer() const {
if (_type_id == &typeid(T))
return reinterpret_cast<const T*>(data);
else
return nullptr;
}

template <typename T>
const T get() const {
assert (_type_id == &typeid(T));
return *get_pointer<T>();
}

alignas(8) char data[8];
const std::type_info *_type_id;
};


std::ostream& operator<<(std::ostream&os, const d_union &u) {
if (auto ip = u.get_pointer<int>())
os << *ip;
if (auto fp = u.get_pointer<float>())
os << *fp;
return os;
}

int main() {

d_union _i = d_union(42);
d_union _f = d_union(3.14f);

std::cout << "d_union(42) = " << _i << std::endl;
std::cout << "d_union(3.14) = " << _f << std::endl;

int _get_i = _i.get<int>();
std::cout << "d_union(42).get<int>() = " << _get_i << std::endl;

// auto _get_auto = _i.get();
// std::cout << "d_union(42).get()" << _get_auto << std::endl;

}

我们将不胜感激任何可能的解决方案!

谢谢

最佳答案

您正在寻找 Boost.TypeErasure图书馆。这将使您能够以自然的方式流式传输任何流。来自教程:

any<
mpl::vector<
copy_constructible<>,
typeid_<>,
incrementable<>,
ostreamable<>
>
> x(10);
++x;
std::cout << x << std::endl; // prints 11

x 这里可以是满足给定概念的任何类型。

如果这不是您想要的,那么 Boost 也有一个名为 Variant 的可识别 union 库,它有一个访问者界面。

关于c++ - 是否可以从受歧视的 union 中自动提取类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30812869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com