首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#定义模板方法

#定义模板方法
EN

Stack Overflow用户
提问于 2020-12-14 22:56:28
回答 2查看 77关注 0票数 2

我想在模板函数中添加调试,但是不考虑重新编辑整个代码。

有没有人能够

代码语言:javascript
复制
    #define theFunction<T>(size) _theFunction<T>(size, __FILE__, __LINE__)
    
    template<class T>  T*  _theFunction(int size, string file, int line)
    {
        if (fails) {
            printf("theFunction failed called at line %i on %s ", line, file);
         }
     }

当然,在宏声明中返回'<‘是意外的。有没有什么技巧可以让它工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-14 23:04:22

可能是这样的东西(未经过测试):

代码语言:javascript
复制
struct TheFunctionHelper {
  std::string file;
  int line;
  template<typename T> 
  T* invoke(int size) {
    return _theFunction<T>(size, file, line);
  }
};

#define theFunction TheFunctionHelper{__FILE__, __LINE__}.invoke
票数 3
EN

Stack Overflow用户

发布于 2020-12-14 23:04:47

在编写宏时,使用编译器标志很有帮助,它允许您在预处理后看到输出。对于gcc来说,这是-E看到的:

代码语言:javascript
复制
#define theFunction(T,size) _theFunction<T>(size, __FILE__, __LINE__)

theFunction(int,42);

扩展为:

代码语言:javascript
复制
_theFunction<int>(42, "./example.cpp", 5);

int作为参数传递给theFunction(int,42)看起来有点奇怪,但是一旦您决定使用宏,事情就变得很奇怪;)。

还要注意,正如在评论中提到的,C++20有std::source_location,它消除了C++中需要使用宏的最后一个角落之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65291188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档