宏定义 类模板 及类模板的全特化

2023-11-09

如下所示,定义一个宏函数,只要传入类型名,即可生成一个类模板

#include <QList>
#include <QVariant>
#include <QMetaType>
#include <typeinfo>
#include <type_traits>
#include <QStringList>

#define FIELD_NAME(cls) CLASS_NAME(cls)
#define GENERATE_FIELD_CLASS(classname) \
template <typename T> struct classname##Field \
{\
    FIELD_NAME(#classname)\
public:\
    classname##Field(){}\
    classname##Field(T val){ value.append(val);}\
    classname##Field(QList<T> val) : value(val){}\
    \
    bool IsField(){return true;}\
    KlarfNodeAttribute Attribute(){ return E_Field;}\
    \
    const QList<T> GetValue() const {return value;}\
    void SetValue(const QList<T>& val){value = val;}\
    void AppendValue(const T& val){ value.append(val);}\
    bool RemoveAt(const int index){\
        if(index >= value.count()) {return false;}\
        value.removeAt(index);return true;\
    }\
    void InsertValue(int i,const T& val){value.insert(i,val);}\
    \
    using Self = classname##Field;\
    \
    virtual Self fromString(const QString& s){ (void)s;return* this;}\
    virtual const QString toString(const QString& indent = default_indent)const { return QString();}\
    \
private:\
    QList<T> value;\
};
/**/

类模板的偏特化 :通过宏函数指定类名及特化类型即可

/// int uint long ulong  longlong ulonglong float
#define GENERATE_FIELD_CLASS_WITH_INTEGER_TYPE(classname,T) \
template<> struct  classname##Field<T>\
{\
    FIELD_NAME(#classname)\
public:\
    classname##Field(){}\
    classname##Field(T val){ value.append(val);}\
    classname##Field(QList<T> val) : value(val){}\
    \
    bool IsField(){return true;}\
    KlarfNodeAttribute Attribute(){ return E_Field;}\
    \
    const QList<T> GetValue() const {return value;}\
    void SetValue(const QList<T>& val){value = val;}\
    void AppendValue(const T& val){ value.append(val);}\
    bool RemoveAt(const int index){\
        if(index >= value.count()) {return false;}\
        value.removeAt(index);return true;\
    }\
    void InsertValue(int i,const T& val){value.insert(i,val);}\
    \
    using Self = classname##Field<T>;\
    \
    virtual Self fromString(const QString& s){ \
        int ns  = s.indexOf("{");\
        int ne  = s.indexOf("}");\
        QString data;\
        if( ns != -1 && ne != -1 ){\
            data = s.mid(ns+1,ne-ns-1).trimmed();\
        }\
        if(!data.isEmpty()){\
            QStringList dl = data.simplified().split(",",Qt::SkipEmptyParts);\
            value.clear();\
            if(#T == "int")\
                foreach (auto ds, dl) value.append(ds.toInt());\
            else if(#T == "uint" || #T == "unsigned int")\
                foreach (auto ds, dl) value.append(ds.toUInt());\
            else if(#T == "long")\
                foreach (auto ds, dl) value.append(ds.toLong());\
            else if(#T == "ulong" || #T == "unsigned long")\
                foreach (auto ds, dl) value.append(ds.toULong());\
            else if(#T == "long long")\
                foreach (auto ds, dl) value.append(ds.toLongLong());\
            else if(#T == "unsigned long long")\
                foreach (auto ds, dl) value.append(ds.toULongLong());\
            else if(#T == "float")\
                foreach (auto ds, dl) value.append(ds.toFloat());\
            else if(#T == "double")\
                foreach (auto ds, dl) value.append(ds.toDouble());\
            else   qt_noop();\
        }\
        return *this; \
    }\
    virtual const QString toString(const QString& indent = default_indent)const {\
        QString s = indent + QString("Field %1 %2 {").arg(#classname).arg(QString::number(value.count()));\
        for(int i = 0; i < value.count();++i){\
            s += QString::number(value[i],10);\
            if(i != value.count() -1) s+=",";\
        }\
        s += "}";\
        return s;\
    }\
    \
private:\
    QList<T> value;\
};
/**/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

宏定义 类模板 及类模板的全特化 的相关文章

  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?

    有人能够在 SMX4 中的两个或多个捆绑包之间成功共享配置吗 我正在寻找的是这样的 有一个文件 SMX HOME etc myconfiguration cfg 使此配置 可用 以便使用 Spring dm 通过 OSGi 配置管理将其注入
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • Web 服务客户端的 AXIS 与 JAX-WS

    我决定用Java 实现Web 服务客户端 我已经在 Eclipse 中生成了 Axis 客户端 并使用 wsimport 生成了 JAS WS 客户端 两种解决方案都有效 现在我必须选择一种来继续 在选择其中之一之前我应该 考虑什么 JAX
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 在Java内存管理中,“PS”代表什么?

    每当我看到 Java 中对内存的引用时 各种空格总是以 PS 为前缀 PS 是什么意思 它开始困扰我 到目前为止我唯一的猜测是 泳池空间 但这将是多余的 例子 PS伊甸园空间 PS 幸存者空间 PS 终身空间 老一代 PS Perm Gen
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 如何在 Hibernate 中自动递增复合主键中的 Id?

    我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ
  • Android - 从渲染线程内结束活动

    下午好 我不熟悉 android 中的活动生命周期 并且一直在尽可能地阅读 但我不知道如何以良好的方式解决以下问题 我有一个使用 GLSurfaceView 的活动来在屏幕上绘制各种内容 在这个 GLSurfaceView 的渲染线程中 我
  • Volley 在第一次调用方法时返回 null

    我正在尝试使用 volley 从服务器检索数据 但是当我第一次调用此方法时 我收到服务器的响应 但该方法返回 null 如果我第二次调用它 我会得到最后的响应 public String retrieveDataFromServer Str
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 扔掉挥发物安全吗?

    大多数时候 我都是这样做的 class a public a i 100 OK delete int j Compiler happy But is it safe The following code will lead compilat
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 将其元素添加到另一个列表后清除列表

    我正在做一个程序 它获取更多句子作为参数 我制作了 2 个列表 一个称为 propozitie 其中包含每个句子 另一个称为 propozitii 其中包含所有句子 问题是 当我在遇到 后清除 propozitie 列表时 它也会清除 pr
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐

  • 嵌入式C语言(一)

    嵌入式 C语言 一 一 Linux基础操作及C语言简单语法 万丈高楼平地起 学习还得靠自己 1 C语言的本质 C语言的本质就是操作内存 2 关键字和标识符 关键字 关键字是指编译器中已经定义好的特殊单词 注意区分大小写 标识符 标识符是用户
  • 6 个高影响力的大型语言模型应用,探索当今可行的现实且高影响力的LLM

    1 Research Assistant 研究助理 如果您曾经写过文章 论文或博客 您就会知道工作的很大一部分在于筛选大量出版物 确定要阅读并理解的相关研究可能是一项艰巨的任务 技术出版物的市场是巨大的 每个月提交到arXiv 的论文数量几
  • leetcode

    文章目录 买卖股票的最佳时机 买卖股票的最佳时机 II 买卖股票的最佳时机 III 买卖股票的最佳时机 IV 最佳买卖股票时机含冷冻期 买卖股票的最佳时机含手续费 买卖股票的最佳时机 前i天的最大收益 max 前i 1天的最大收益 第i天的
  • okhttp3源码解析(3)-拦截器 II

    okhttp3源码解析 3 拦截器 II 前言 上篇博文从RealInterceptorChain开始 讲解了RetryAndFollowUpInterceptor和BridgeInterceptor两个拦截器 后面还有三个系统拦截器 其实
  • Flink执行流程

    1 flink关键字对比spark flink spark operator RDD operator chain stage data flow DAG one to one 窄依赖 redistribute 宽依赖 subtask ta
  • 如何使用 Parallels Desktop 虚拟机在 Mac 上安装 Windows 系统!

    一 下载安装 Parallels Desktop for Mac 如果您刚开始接触 Parallels Desktop for Mac 请点击下载最新版本 访问 如果已是 Parallels Desktop 用户 请继续执行后续步骤 二 自
  • STM32使用bool型变量

    环境Keil5 编译器 include
  • facebook 获取好友列表

    直接上函数 public void getfriends if Session getActiveSession null Session getActiveSession isOpened new Request Session getA
  • javamail发送邮件

    废话不多说 直接上代码 以下三段代码是我的全部代码 朋友们如果想用 直接复制即可 jar包因为我不知道怎么传到javaeye上 所以朋友们回去自己打吧 我的代码有三个类 第一个类 MailSenderInfo java package co
  • Win10 AMD显卡不兼容造成的开机黑屏问题解决

    1 将以下文本粘贴到文本文件中 保存为ULPS Disable reg Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SYSTEM ControlSet001 Control
  • 根据点云高度赋色(附open3d python代码)

    绘制点云图时用颜色来表征其高度 我们先计算了点云的高度范围 然后把每个点的颜色根据高度来进行映射 稍微修改代码 我们也可以让高度颜色渐变转换为 X 轴距离颜色渐变 稍微修改代码 我们也可以让高度颜色渐变转换为 X 轴距离颜色渐变 codin
  • Promise 实现原理

    文章目录 一 Promise 介绍 二 promise 源码实现 一 Promise 介绍 定义 Promise 是异步编程的一种解决方法 比传统的回调函数和事件更合理 它是由社区提出和实现经由 ES6 将其写进语言标准 并在原生提供了 P
  • Linux安装python3和pip3

    安装python3 yum y install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel readline devel tk devel gdbm dev
  • python serial打开M5串口重启问题

    使用比较常用的方法打开串口 import serial ser serial Serial COM3 115200 使用上述代码 第一次打开会导致m5重启 重启的原因可能跟烧录类似 在烧录程序完毕以后都会重启 解决方法 import ser
  • 问题/lib64/libc.so.6: version `GLIBC_2.18‘ not found

    1 首先下载GLIBC 2 18到本地 2 解压压缩包 3 cd进入到解压好的文件夹内 mkdir build 4 cd build 执行该命令 configure prefix usr disable profile enable add
  • python 绘制正弦余弦函数 matplotlib的基本使用

    matplotlib的基本使用 import matplotlib pyplot as mp import numpy as np x np linspace 0 2 np pi 1000 y sin np sin x y cos np c
  • [初学python]新类(new-style class)

    类 class 也是对象在python之中 万物皆对象 类也是对象 类的类 就被称为元类 即类是元类的实例 正如类的实例的行为取决于类 元类的实例 类 的行为也取决于元类 new style classes的由来new style clas
  • 华为OD机试真题Java_2022-2023-题目0189-最多等和不相交连续子序列

    最多等和不相交连续子序列 题目描述 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的和 数组中可能存在几组连续子序列 组内的连续子序列互不相交且有相同的和 求一组连续子序列 组内子序列的数目最多 输出这个数目 输
  • 笔记24-2(C语言进阶 程序环境和预处理)

    目录 注 预定义详解 预处理符号 举例 使用例 define define 定义标识符 define定义宏 括号很重要 define 替换规则 和 带副作用的宏参数 宏和函数的对比 命名约定 undef 命名行定义 条件编译 常见的条件编译
  • 宏定义 类模板 及类模板的全特化

    如下所示 定义一个宏函数 只要传入类型名 即可生成一个类模板 include