我有一个模板函数从多个其他函数调用,需要记录调用它的函数的名称。理想情况下,我想做类似以下的事情:
template <typename T, const char* CALLER>
void foo(const T& arg) {
// ...
}
但是,当然,这不会编译,因为CALLER
是无效的模板参数。当然,我可以简单地修改foo
的签名,也可以使用字符串(调用者的名字)来实现这一点。
问题:是否有一种首选的C ++惯用方式来实现这类功能?
答案 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__
}