确定是否有针对特定类型的参数定义的超载函数
Determine if there is an overloaded function defined for a parameter of a specific type
我有一个简单的序列化框架,该框架定义了各种类型的读写模板函数的专业化,包括算术,我的类,我的类和诸如向量,数组,映射等的STD容器,因此可以做
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_serializizizizizizizize除了读写之外,但这需要更多的键入,并且使代码更复杂,因此拥有is_serializable可自动定义更优雅。
>它也可以是一些序列化模板类,其中读写功能为成员。在这种情况下,我需要知道是否有针对特定类型的序列化器的专业化。例如,我可以对此进行这样的操作。
您可以使用 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>);
相关文章:
- 如何使用宏根据参数定义不同的数据类型?
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 如何通过opencv中的程序参数定义特征类型?
- 确定是否有针对特定类型的参数定义的超载函数
- C 试图使用函数参数定义2D数组
- 是否可以为模板模板参数定义别名
- C++11:用容器参数定义函数(类似于基于范围的)
- C++-用类参数定义矢量大小
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 如果我使用非常量参数定义那些,我是否仍然会获得默认的复制构造函数和运算符 =
- 使用参数定义的打印方法名称
- 如何根据类参数定义成员类运算符
- 如何为引用参数定义模板函数,为指针参数定义相同的函数
- boost::函数参数定义不起作用
- 如何基于不同的参数定义相同的宏函数
- 如何基于不同的参数定义相同的宏函数
- 将参数定义为未指定的模板类型
- C++模板,vector.size用于默认参数定义
- 如何为CamShift的矩形输入参数定义矩形变量