将调用者姓名传递给模板化函数的惯用法

时间:2017-04-10 20:22:40

标签: c++ templates

我有一个模板函数从多个其他函数调用,需要记录调用它的函数的名称。理想情况下,我想做类似以下的事情:

template <typename T, const char* CALLER>
void foo(const T& arg) {
    // ...
}

但是,当然,这不会编译,因为CALLER是无效的模板参数。当然,我可以简单地修改foo的签名,也可以使用字符串(调用者的名字)来实现这一点。

问题:是否有一种首选的C ++惯用方式来实现这类功能?

1 个答案:

答案 0 :(得分:3)

不幸的是你can't use string literals as template arguments

  

因为字符串文字是具有内部链接的对象(两个具有相同值但在不同模块中的字符串文字是不同的对象),所以不能将它们用作模板参数

因此,您可能希望将其作为参数传递给您的函数,例如:

template<typename T>
void foo(T t, const char* func)
{
    std::cout << func << ": " << t << '\n';
}

然后,将foo与有效const char*一起调用到调用方

的责任
void bar()
{
    foo(1, __func__); // callers responsibility to pass __func__
}

如果这是一个负担,您可以将foo包裹在一个将为您传递__func__的宏中。

#define CALL_FOO(x) foo(x, __func__)

void bar()
{
    CALL_FOO(1);      // use the macro to pass __func__
}