gpt4 book ai didi

c++ - 将调用者姓名传递到模板函数中的惯用方式

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:01 43 4
gpt4 key购买 nike

我有一个从多个其他函数调用的模板化函数,需要记录调用它的函数的名称。理想情况下,我想执行以下操作:

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

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

问题:是否有首选的 C++ 惯用方法来实现此类事情?

最佳答案

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

Because string literals are objects with internal linkage (two string literals with the same value but in different modules are different objects), you can't use them as template arguments either

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

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

然后将使用有效的 const char* 调用 foo 的责任传递给调用者

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__
}

关于c++ - 将调用者姓名传递到模板函数中的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332307/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com