gpt4 book ai didi

c++ - 如果一个类型 `T` 有一个 `template<> struct Writer` 来序列化自己

转载 作者:行者123 更新时间:2023-12-04 12:31:11 25 4
gpt4 key购买 nike

我有一个 Writer 结构来做一些序列化

template<typename T>
struct Writer {}; // only specialized version has ::wrap_t

template<>
struct Writer <int> {
typedef int wrap_t;
};
template <typename T>
using Writer_wrap_t = typename Writer<T>::wrap_t;

template<>
struct Writer<float> {
typedef float wrap_t;
};

我想知道一个类型是否有专门的 Writer。代码未按预期工作:

template<typename T, typename U = Writer_wrap_t <T>>
struct has_writer : std::true_type {};

template<typename T>
struct has_writer<T, void> : std::false_type {};

int main() {
bool b = has_writer <double>::value;
// error C2794: 'wrap_t': is not a member of any direct or indirect base class of 'Writer<T>'
// error C2976: 'has_reflect': too few template arguments
// error C2938: 'Writer_wrap_t ' : Failed to specialize alias template
}

我想 has_writer<double>没有使用专业版struct has_writer<T, void> : std::false_type {};

但是现在第一个替换失败了,编译器不应该尝试实例化第二个版本吗?

最佳答案

您没有正确使用 SFINAE。典型的模式是定义一个主模板,其中第二个模板参数是 void

template<typename T, typename = void>
struct has_writer : std::false_type {};

然后使用您要检查的任何类型的 std::void_t 作为第二个参数来专门化模板

template<typename T>
struct has_writer<T, std::void_t<Writer_wrap_t <T>>> : std::true_type {};

如果您传递给 void_t 的类型是合式的,则选择特化,这是 true 的情况,否则选择主要的,这是 false 的情况。 Writer_wrap_t 本身只有在传递给它的类型具有成员 typedef wrap_t 时才是良构的。

关于c++ - 如果一个类型 `T` 有一个 `template<> struct Writer<T>` 来序列化自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68992941/

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