gpt4 book ai didi

c++ - 判断是否有为特定类型的参数定义的重载函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:26 24 4
gpt4 key购买 nike

我有一个简单的序列化框架,它定义了各种类型的读写模板函数的特化,包括算术、我的类和标准容器,如 vector 、数组、映射等......,所以可以做

std::vector<std::string> v{ "a1", "b123", "c12345" };
Read(stream, v);
Write(stream, v);

std::map<int, MyClass> m;
Read(stream, m);
Write(stream, m);

,例如。

我正在寻找一种方法来确定在编译时是不是可序列化的类型,方法如下:

template <class T>
constexpr bool is_serializable()
{
if (Read<T> and Write<T> are defined)
return true;
return false;
}

或者可能是别的东西。

这可能吗?

读写声明:

    template <typename T>
void Read(InputStream & s, T & val);

template <typename T>
void Write(OutputStream & s, T val);

理论上,除了读取和写入之外,我可以为我需要的每个类型定义 is_serializable,但这需要更多的输入,并且可能使代码更复杂,因此自动定义 is_serializable 是更优雅的方式。

也可以是一些Serializer模板类,成员有Read和Write函数。在这种情况下,我需要知道是否有针对特定类型的 Serializer 专门化。例如,我可以做 something like this与它。

最佳答案

您可以使用 std::void_t 和 SFINAE 来实现它。 cppreference 中的 std::void_t 文档很棒。

#include <type_traits>
#include <iostream>

void Read(std::istream &,double &) {}
void Write(std::ostream &,double) {}

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

template <typename T>
struct is_serializable_t<T,std::void_t<
decltype(Read(std::declval<std::istream &>(),std::declval<T &>())),
decltype(Write(std::declval<std::ostream &>(),std::declval<T>()))>>:
std::true_type {};

template <typename T>
inline constexpr bool is_serializable = is_serializable_t<T>::value;

static_assert(is_serializable<double>);
static_assert(!is_serializable<int>);

关于c++ - 判断是否有为特定类型的参数定义的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54768823/

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