gpt4 book ai didi

c++ - 变体类型和可变参数模板的转换和输出运算符

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:02 25 4
gpt4 key购买 nike

我最近问了另一个关于这个的问题,我想知道如何才能提供一个具有此处所示结构的类 https://gist.github.com/tibordp/6909880使用转换运算符,例如 operator string() .基本上代码中说明的想法是 union 和变体类型。 union 元素是 data_t 类型的对象.这本身就是 std::aligned_storage 的类型定义。与适当的类。

特别是我正在寻找一种方法来查询给定的模板类并返回 static_cast编辑对象。如果查询的类型都不正确,则 static_assert 应该失败或常规断言应该失败。我看到可能有一种方法可以遍历给定的模板化类并将它们的 typeid().hash_code() 存储在一个集合中,然后查询它,但这似乎不是这里最有效的解决方案。

所以像下面这样

template <typename... Vs>
struct variant {
typename std::aligned_union<Types...>::type storage;
int hash_code_of_type_stored;

template <typename Type>
operator Type() {
// static assert if the type is not in Vs... or assert fail
// otherwise return the appropriate static_cast
}
};

这可以通过将输入类型的 hash_code 与存储的对象类型进行比较的断言来实现。但这并不令人满意,因为我想以某种方式知道存储在这里的对象的类型,以便例如我可以重载 operator<<。正确使用 ostreams 的功能。

也作为旁注。如果你有 operator string()在具有字符串作为成员变量的自定义结构上定义的函数,那么函数返回什么?只有将其作为 const 引用才有意义,但我想确定一下。

最佳答案

我最近实现了自己的可变参数模板,用于检查某个类型是否在参数包中。我从另一个 SO 用户那里得到了我的解决方案:

Check if C++0x parameter pack contains a type

template <typename... Vs>
struct variant {
typename std::aligned_union<Types...>::type storage;
int hash_code_of_type_stored;

template <typename Type>
operator Type() {
static_assert(contains<Type, Vs...>::value,
"parameter pack should contain Type");
}
};

关于c++ - 变体类型和可变参数模板的转换和输出运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36214754/

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