gpt4 book ai didi

C++模板自动参数

转载 作者:行者123 更新时间:2023-11-28 00:12:19 24 4
gpt4 key购买 nike

我正在尝试编写一个(几乎)自动跟踪进入和退出方法的日志记录例程。像这样的东西:

int rc=0;
LOG_ENTRY("MyFunction()", rc);

LOG_ENTRY 是定义本地对象的宏。创建对象时,它将使用“Entry MyFunction()”调用记录器,当对象在跟踪方法结束时销毁时,析构函数将发出“Exit MyFunction() returned 0”,其中 0 是 rc 的值退出时。

除了必须为每种类型的返回值定义日志对象类的构造函数外,现在我已经使用 C++ 完成了大部分工作:

class IM_EX_CTIBASE LogEntry
{
Log *logger;
const char* func;
void *rc;
public:
LogEntry(Log *logger, const char* func, int *rc)
{
this->logger=logger;
this->func=func;
this->rc=rc;
logger->log("Entry " << func);
}
~LogEntry()
{
logger->log("Exit " << func << *rc);
}
}

(请原谅任何错别字,这是实际代码的简化版本。)

现在我希望将其重写为模板,其中类型 rc 可以在外部定义。我当时认为 auto 是在构造函数上定义 rc 的绝佳可能性,但 auto 在那里不起作用。

既然编译器已经知道类型是什么,为什么还要在这里定义呢。 log()(接受流)应该已经知道如何使用 rc。

我看过很多替代方案,但似乎没有什么是我想要的。有人建议“像 make_pair 那样做”,但在深入研究之后,它似乎创建了一个函数模板,我认为你不能在构造函数中使用它。

有人有什么想法吗?

最佳答案

也许是这样的:

template <typename T>
class LogEntry {
public:
LogEntry(Log *logger, const char* func, T* rc);
};

#define LOG_ENTRY(name, ret) \
LogEntry<decltype(ret)> log_entry(logger, name, &ret);

填写 LogEntry 实现的细节留给读者作为练习。

关于C++模板自动参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32356592/

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