ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

将宏定义的函数转换为C中的模板

2019-08-23 16:08:28  阅读:264  来源: 互联网

标签:member-functions c class templates macros


我在a C++ program中处理以下难以调试的代码.我对C很新,但我认为这可能是转换为模板的好选择.但是,我很难理解它会是什么样子以及如何调用新函数.我是否仍然有多个load_func函数,然后只调用指定显式类型的模板函数?或者可以用单个功能模板替换所有这8个功能?哪种方法会更好?我相信第一种方法需要对其他文件进行最少的修改,而第二种方法要求我更新对这些函数的所有调用以明确指定类型.

class mmu_t
{
public:
//...
  // template for functions that load an aligned value from memory
  #define load_func(type) \
    inline type##_t load_##type(reg_t addr) { \
      // ... Other code elided for clarity
      type##_t res; \
      load_slow_path(addr, sizeof(type##_t), (uint8_t*)&res); \
      return res; \
    }

  // load value from memory at aligned address; zero extend to register width
  load_func(uint8)
  load_func(uint16)
  load_func(uint32)
  load_func(uint64)

  // load value from memory at aligned address; sign extend to register width
  load_func(int8)
  load_func(int16)
  load_func(int32)
  load_func(int64)
}

解决方法:

这里棘手的问题是现有代码定义了8个具有8个不同名称的函数(load_uint8,load_uint16,…,load_int64),但函数模板只有一个名称.

当然,您可以将其更改为

template <typename T>
inline T load_integer(reg_t addr) {
    static_assert(std::is_integral<T>::value, "T must be an integer type");
    // Other code...
    T res;
    load_slow_path(addr, sizeof(T), reinterpret_cast<uint8_t*>(&res));
    return res;
}

但是,如果你用它替换它,是的,其余代码需要从mmu.load_uint8(addr)更改为mmu.load_integer< uint8_t>(addr)等等.

因此,提供旧功能以实现向后兼容可能是个好主意:

inline uint8_t load_uint8(reg_t addr) { return load_integer<uint8_t>(addr); }
// ...

那时候,你有什么改变但是改进了那个类的风格了吗?生成的可执行代码可能根本不相同.您确实获得了一个好处:现在load_integer< T>可以从另一个模板函数调用,该函数对多种类型的整数数据进行操作.

标签:member-functions,c,class,templates,macros
来源: https://codeday.me/bug/20190823/1698789.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有