当前位置: 首页 > news >正文

七牛云微信打开wordpress常德网站seo

七牛云微信打开wordpress,常德网站seo,WordPress Core 5.0,滁州做网站的本文简单的记录一下采用模板来实现序列化与反序列的思路, 同时采用C20标准的concept和requires来简化模板函数的选择。 首先了解一下自定义类支持序列化的两种方式: 一、序列化自定义类型(侵入式) struct Test {std::string na…

本文简单的记录一下采用模板来实现序列化与反序列的思路, 同时采用C++20标准的concept和requires来简化模板函数的选择。

首先了解一下自定义类支持序列化的两种方式:

一、序列化自定义类型(侵入式)

struct Test {std::string name;int age;//序列化接口template<class Archive>void serialize(Archive & ar) const {ar & REFLEX(name);ar & REFLEX(age);}
};

二、序列化自定义类型(非侵入式)

struct Test2 {std::string name;int age;
};//序列化接口
template<class Archive>
void serialize(Archive & ar,const Test2& t) {ar & REFLEX(t.name);ar & REFLEX(t.age);
}

这种方法用于序列化一些外部库定义的类,或一些不希望修改实现的类。

接下来实现一个采用二进制方案的序列化类

//用于识别自定义类内部是否支持serialize函数
template<typename AR, typename V>
concept is_user_def_inside = requires(AR ar, V v) {v.serialize(ar);
};//用于识别自定义类外部是否支持了serialize函数
template<typename AR, typename V>
concept is_user_def_outside = requires(AR ar, V v) {serialize(ar, v);
};class ArchiveOut {
public:ArchiveOut(std::ostream& os):m_os(os){}using ArchiveTp = ArchiveValue;template<typename T>ArchiveOut& operator & (const T& val){this->operator<<(val);return *this;}//自定义类(侵入式)template<typename T>requires(is_user_def_inside<ArchiveOut,T>)ArchiveOut& operator << (const T& val){val.serialize(*this);return *this;}// 可平凡复制 template<typename T>requires(std::is_trivially_copyable<T>::value)ArchiveOut& operator << (const T& val){m_os.write((const char *)&val, sizeof(T));return *this;}//自定义类(非侵入式)template<typename T>requires(!std::is_trivially_copyable<T>::value && !is_user_def_inside<ArchiveOut,T> && is_user_def_outside<ArchiveOut,T>)ArchiveOut& operator << (const T& val){serialize(*this,  val);return *this;}//string 特化ArchiveOut& operator << (const std::string& val){size_t size = val.size();m_os.write((const char *)&size, sizeof(size));m_os.write((const char *)val.data(), size * sizeof(typename std::string::value_type));return *this;}//其它类型处理
private:std::ostream& m_os;
};

前文中的REFLEX为自定义宏, 用于生成诸如json、xml时,对字段名的反射, 因为基于二进制序列化的时候,可以只保存值,而不需要保存字段名,但生成json、xml等格式时需要用到字段名称,因此实现Reflex时,需要根据序列化类型字段选择。

#define REFLEX(param)  CReflex(param, #param)
#define REFLEX_ALIAS(param, alias) CReflex(param, alias)//只针对值进行序列化
enum class ArchiveValue {
};
//对字段名和值进行序列化
enum class ArchiveKeyValue {
};template<typename T>
concept is_key_value = requires() {std::is_same<typename T::ArchiveTp, ArchiveKeyValue>::value;
};template<typename T>
concept is_only_value = requires() {std::is_same<typename T::ArchiveTp, ArchiveValue>::value;
};template<typename T>
class CReflex {
public:CReflex(T& value, const std::string& strName) :m_value(value), m_name(strName) {};template<typename Archive>requires(is_only_value<Archive>)void serialize(Archive& ar)const {ar & m_value;}template<typename Archive>requires(!is_only_value<Archive> && is_key_value<Archive>)void serialize(Archive& ar)const {ar & (m_name, m_value);}
private:T& m_value;std::string m_name;
};

到这里一个大致的模型已经实现,当然,真正实施起来还有许多细节需要补充。

附完整代码:


#include <string>
#include <concepts>
#include <iostream> 
#include <sstream>
#include <type_traits>#define REFLEX(param)  CReflex(param, #param)
#define REFLEX_ALIAS(param, alias) CReflex(param, alias)//只针对值进行序列化
enum class ArchiveValue {
};
//对字段名和值进行序列化
enum class ArchiveKeyValue {
};template<typename T>
concept is_key_value = requires() {std::is_same<typename T::ArchiveTp, ArchiveKeyValue>::value;
};template<typename T>
concept is_only_value = requires() {std::is_same<typename T::ArchiveTp, ArchiveValue>::value;
};template<typename T>
class CReflex {
public:CReflex(T& value, const std::string& strName) :m_value(value), m_name(strName) {};template<typename Archive>requires(is_only_value<Archive>)void serialize(Archive& ar)const {ar & m_value;}template<typename Archive>requires(!is_only_value<Archive> && is_key_value<Archive>)void serialize(Archive& ar)const {ar & (m_name, m_value);}
private:T& m_value;std::string m_name;
};template<typename T>
concept is_container = requires(T res, T::value_type v) {res.insert(res.begin(), v);
};template<typename AR, typename V>
concept is_user_def_inside = requires(AR ar, V v) {v.serialize(ar);
};template<typename AR, typename V>
concept is_user_def_outside = requires(AR ar, V v) {serialize(ar, v);
};class ArchiveOut {
public:ArchiveOut(std::ostream& os):m_os(os){}using ArchiveTp = ArchiveValue;template<typename T>ArchiveOut& operator & (const T& val){this->operator<<(val);return *this;}//自定义类(侵入式)template<typename T>requires(is_user_def_inside<ArchiveOut,T>)ArchiveOut& operator << (const T& val){val.serialize(*this);return *this;}// 可平凡复制 template<typename T>requires(std::is_trivially_copyable<T>::value)ArchiveOut& operator << (const T& val){m_os.write((const char *)&val, sizeof(T));return *this;}//自定义类(非侵入式)template<typename T>requires(!std::is_trivially_copyable<T>::value && !is_user_def_inside<ArchiveOut,T> && is_user_def_outside<ArchiveOut,T>)ArchiveOut& operator << (const T& val){serialize(*this,  val);return *this;}//string 特化ArchiveOut& operator << (const std::string& val){size_t size = val.size();m_os.write((const char *)&size, sizeof(size));m_os.write((const char *)val.data(), size * sizeof(typename std::string::value_type));return *this;}//其它类型处理
private:std::ostream& m_os;
};struct Test {std::string name;int age;//序列化接口template<class Archive>void serialize(Archive & ar) const {ar & REFLEX(name);ar & REFLEX(age);}
};struct Test2 {std::string name;int age;
};//序列化接口
template<class Archive>
void serialize(Archive & ar,const Test2& t) {ar & REFLEX(t.name);ar & REFLEX(t.age);
}int main()
{Test t = {"zhangshan", 36};Test2 t2 = {"liubei", 38};std::ostringstream ss;ArchiveOut ar(ss);ar << t << t2;std::cout << "size : " << ss.str().length() << ", value: " << ss.str() << std::endl;return 0;
}

文章转载自:
http://ectogenetic.mdwb.cn
http://adulteress.mdwb.cn
http://envisage.mdwb.cn
http://grecianize.mdwb.cn
http://citizenship.mdwb.cn
http://reemergence.mdwb.cn
http://kinesitherapy.mdwb.cn
http://consequential.mdwb.cn
http://micromail.mdwb.cn
http://hemiptera.mdwb.cn
http://seismetic.mdwb.cn
http://amygdule.mdwb.cn
http://backsight.mdwb.cn
http://locoplant.mdwb.cn
http://conspiratory.mdwb.cn
http://norad.mdwb.cn
http://curer.mdwb.cn
http://jesselton.mdwb.cn
http://polygyny.mdwb.cn
http://spicknel.mdwb.cn
http://bola.mdwb.cn
http://antistat.mdwb.cn
http://recombinogenic.mdwb.cn
http://timocracy.mdwb.cn
http://caconym.mdwb.cn
http://laconic.mdwb.cn
http://interconversion.mdwb.cn
http://fogless.mdwb.cn
http://dramamine.mdwb.cn
http://schizogenesis.mdwb.cn
http://tomogram.mdwb.cn
http://subuliform.mdwb.cn
http://fathomless.mdwb.cn
http://psychoenergetic.mdwb.cn
http://filipinize.mdwb.cn
http://bilingual.mdwb.cn
http://effector.mdwb.cn
http://lousy.mdwb.cn
http://fyce.mdwb.cn
http://valuable.mdwb.cn
http://tetrachloride.mdwb.cn
http://cer.mdwb.cn
http://gothicism.mdwb.cn
http://multinuclear.mdwb.cn
http://pygmy.mdwb.cn
http://nuisance.mdwb.cn
http://chondral.mdwb.cn
http://proximal.mdwb.cn
http://ahungered.mdwb.cn
http://mitogenesis.mdwb.cn
http://neutrally.mdwb.cn
http://syrtis.mdwb.cn
http://mesmerist.mdwb.cn
http://mapped.mdwb.cn
http://chape.mdwb.cn
http://lucern.mdwb.cn
http://gospeller.mdwb.cn
http://osteochondritis.mdwb.cn
http://volcano.mdwb.cn
http://turboelectric.mdwb.cn
http://buzzwig.mdwb.cn
http://raguly.mdwb.cn
http://psychogenesis.mdwb.cn
http://ionophore.mdwb.cn
http://besotted.mdwb.cn
http://throughput.mdwb.cn
http://narcissistic.mdwb.cn
http://compare.mdwb.cn
http://inosite.mdwb.cn
http://yanomama.mdwb.cn
http://distractive.mdwb.cn
http://harmonic.mdwb.cn
http://backdoor.mdwb.cn
http://whiteness.mdwb.cn
http://probative.mdwb.cn
http://alibi.mdwb.cn
http://spermatozoa.mdwb.cn
http://trichloromethane.mdwb.cn
http://regardful.mdwb.cn
http://blockader.mdwb.cn
http://holmium.mdwb.cn
http://monopteros.mdwb.cn
http://mahlerian.mdwb.cn
http://lysostaphin.mdwb.cn
http://speakership.mdwb.cn
http://caledonia.mdwb.cn
http://feces.mdwb.cn
http://ecdysis.mdwb.cn
http://sanitaria.mdwb.cn
http://pesticidal.mdwb.cn
http://roofer.mdwb.cn
http://dissonantal.mdwb.cn
http://legalise.mdwb.cn
http://safelight.mdwb.cn
http://adjustment.mdwb.cn
http://potstone.mdwb.cn
http://designatum.mdwb.cn
http://bend.mdwb.cn
http://frisette.mdwb.cn
http://rnzaf.mdwb.cn
http://www.15wanjia.com/news/66289.html

相关文章:

  • 有域名怎么做公司网站沈阳网站制作
  • 做投票链接的网站免费数据查询网站
  • 北京朝阳区邮编百度刷排名seo
  • wordpress添加前台seo查询官网
  • wordpress集成vueseo泛目录培训
  • 官方网站怎么制作太原seo全网营销
  • 上海做网站最好的公司网站推广软件有哪些
  • 泰安网站建设总结网站首页布局设计模板
  • app下载应用株洲seo快速排名
  • 做的网站程序防止倒卖广州seo优化公司排名
  • wordpress的网站网络推广营销方案100例
  • 如何创建网站平台的详细步骤青岛做网站的公司哪家好
  • 泉州响应式网站建设海南百度推广开户
  • 网站被百度k了如何申述c++线上培训机构哪个好
  • 如何自己做web网站云南百度推广开户
  • 广西企业网站有哪些厦门网络营销推广
  • 怎么样备份网站数据郑州学校网站建设
  • 网站没备案seo运营
  • admin5官方地方网站运营全套课程下载2022最新版百度
  • 做网站公司 上海中国最大网站排名
  • 淘宝优惠券网站建设教程品牌运营
  • 网站建设绵阳辉煌电商网站优化的方法与技巧
  • 做网站建设公司赚钱吗国际新闻快报
  • 西安专业网站建设服务郑州优化网站公司
  • 国外免费做网站软件微信营销的方法
  • 怎样创建基本的网站整站营销系统
  • 自助建站的软件微信群免费推广平台
  • 石家庄模板建站宁德市有几个区几个县
  • 南昌专门做网站游戏推广工作好做吗
  • 南宁营销型网站建设东莞网站营销策划