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

标签 c++ class templates macros member-functions

我在 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)
}

最佳答案

这很有可能,而且非常简单。

  1. ##type成为调用站点的模板参数,例如 load<uint8_t> .
  2. 函数定义几乎相同。只是现在模板参数是类型的替代品。

    template<typename T>
    inline T load(reg_t addr) {
      // ... Other code elided for clarity
      T res; 
      load_slow_path(addr, sizeof(T), (uint8_t*)&res); 
      return res; 
    }
    

就是这样。除了调整调用站点外,无需执行任何其他操作。但我认为您的简洁是值得的。

如果这太令人生畏,那么您可以创建模板,并将宏定义更改为简单的转发功能,如您在帖子中所述。

只有您才能权衡成本与 yield 。

关于c++ - 将宏定义的函数转换为 C++ 中的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46720220/

相关文章:

c++ - 将本地时间转换为 time_t (C++)

c++ - ICU 无法解析的外部符号

c++ - 查找库中的所有动态初始化

c++ - 编译器不理解递归函数来打印树级顺序 C++

c++ - 在 C++ 中使用数组容器声明可变长度数组

python - 无法使用我的抓取工具中的方法生成的链接

python - 子类、意外参数和 Unresolved 引用的问题

c++ - 给定传递给它的参数类型,如何确定函数参数的类型?

c++ - 固定大小的多维数组参数

c++ - 如何编写一个带有模板化函数参数的包装函数,它可以接受重载的成员函数?