gpt4 book ai didi

c++ - 将函数指针转换为成员函数

转载 作者:太空狗 更新时间:2023-10-29 23:10:44 25 4
gpt4 key购买 nike

我正在编写一个类来进行时序分析;它“记住”代码中各个点的时间并根据要求转储其结果。

有效。

但我想让它通过调用现有的记录器函数来转储结果。我很接近但无法编译。这是一个简短的版本:

class TheLogger
{
public:
TheLogger() {}
void log(const char* format, ...)
{
va_list argptr;
va_start(argptr, format);
vfprintf(stderr, format, argptr);
va_end(argptr);
}
};

// And there's a different unrelated logger with same signature
class AnotherLogger
{
public:
TheLogger() {}
void logMessage(const char* format, ...)
{
va_list argptr;
va_start(argptr, format);
vsprintf(buf, format, argptr);
va_end(argptr);
doSomething(buf);
}
};

class TqTimingPoint
{
public:
TqTimingPoint(const std::string &name, void (*logger)(const char* format, ...) ) :
mName(name),
mpLoggerFcn(logger)
{ }

void dump()
{
(this->mpLoggerFcn)( mName.c_str() );
}

private:
std::string mName; // Name of this collector

void (*mpLoggerFcn)(const char* format, ...);
};

int
main(int, char **)
{
TheLogger *pLogger = new TheLogger;
pLogger->log("yo baby\n");

TqTimingPoint tp1("testCom", &TheLogger::log);

AnotherLogger *pLogger2 = new AnotherLogger;
TqTimingPoint tp2("testCom", &AnotherLogger::logMessage);
}

我不知道如何将记录器函数传递给 TqTimingPoint 构造函数。

TqTimingPoint tp("testCom", &pLogger->log);

提示 ISO C++ 禁止采用绑定(bind)成员函数的地址来形成指向成员函数的指针。说‘&TheLogger::log’

在尝试时:

TqTimingPoint tp("testCom", &TheLogger::log)

提示

没有匹配函数来调用‘TqTimingPoint::TqTimingPoint(const char [8], void (TheLogger::*)(const char*, ...))’

我希望 TimingPoint 类接受任何记录器函数,只要它具有相同的可变参数签名即可。它不应该在其中的任何地方硬编码 TheLogger::

所以,我想我需要在 main() 中转换 TheLogger::log,但我尝试过的组合都不起作用...

(如果记录器函数是在全局范围内定义的,它工作正常。问题只存在于类中的 log 方法)

编辑我

一些我之前没有提到的限制:

a) 记录器类不是“我的”,不能修改。所以坚持使用它提供的签名。 (真正的记录器类更复杂,是的,确实使用了非静态的 log() 成员

b) 编译器是 gcc -std=cxx+11

c) TqTimingPoint 无法识别(硬编码)特定的记录器类,因为有一个不同的、不相关的记录器 AnotherLogger 恰好具有相同的签名

最佳答案

经过一番搜索后,我恍然大悟:问题当然是隐含的this。每个成员函数都有一个隐式的 this 成员,这意味着您必须包括源类的类型规范,以便接收指针知道您实际传入的内容(并且编译器知道它正在为什么分配内存).

使这项工作有效的唯一方法是将源函数和接收函数设为静态,或者将其与继承混合,以便您可以将基类函数指针 Base::foo 传递给虚拟函数并将其计算为任意 Derived::foo

关于c++ - 将函数指针转换为成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401378/

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