在写序列化部分的时候遇到一点问题,我想对不同类型共用同一套序列化的逻辑。 对于类,我的做法是定义接口,类似:
class Interface { public: cstring serialize(); };
然后调用接口来做序列化
template <typename T> cstring do_serialize(const T &t) { return t.serialize(); } template <typename T, typename... Args> cstring do_serialize(const T &t, const Args &... object) { return t.serialize() + do_serialize(object...); }
但是内置类型没法实现 serialize(),我该怎么处理才比较好。
![]() | 1 wwqgtxx 2020-01-14 17:22:37 +08:00 ![]() 模板可以对类型特化 |
![]() | 2 23571113 OP @wwqgtxx 感谢,我 nc 了,想着去用 if 判断类型了,于是 int,const int,const int & ...都不是一个类型把我搞蒙了。 |
![]() | 3 wutiantong 2020-01-14 17:25:51 +08:00 ![]() 你不要用这个 class Interface,它很不 cpp 你要用这个: template<class T> struct serialize_op { cstring operator() (T const &) const; }; |
4 wevsty 2020-01-14 18:01:24 +08:00 ![]() 如果是 C++17 以上,在模板里判断类型也很方便的。 ``` template<typename T> auto do_serialize(T t) { if constexpr(std::is_integral<T>::value) {return std::to_string(t);} else {return t;} } ``` |