如何将存储在 std::string 中的指针转换回可调用函数?

How can I convert a pointer stored in an std::string, back into a callable function?

我正在将指向函数的指针存储为字符串:

//callback = std::function<void()> callback

std::stringstream cbPtrToString;
cbPtrToString << &callback;
std::string prtString = cbPtrToString.str();

如何将 prtString 转换回可调用函数?我在下面尝试过这个,但它并没有像我想的那样。

std::stringstream stringToPtr(ptrString);
void* result;
stringToPtr >> result;
result();

按照你的例子,你有 std::function<void()> 作为你的回调。我首先建议您将其设为 typedef 和一些简单的转换函数:

typedef std::function<void()> CallbackType;

std::string CallbackToString(const CallbackType* cb)
{
    std::ostringstream oss;
    oss << reinterpret_cast<uintptr_t>(cb);
    return oss.str();
}

const CallbackType* StringToCallback(const std::string& str)
{
    std::istringstream iss(str);
    uintptr_t ptr;
    return (iss >> ptr) ? reinterpret_cast<CallbackType*>(ptr) : nullptr;
}

C++ 标准允许将指针类型转换为 uintptr_t 并返回,如果这些值仅在同一进程中使用,则可能接受 table 这样做。

但是,您必须确保您的函数确实存在。在 this live example 中,它们存储在 main 中的堆栈中。但是,如果您将它们创建为临时对象,然后在对象被销毁后使用这些指针,那就不好了。

如果您不想重新解释指针,那么正如评论中已经建议的那样,您可以存储一些其他类型的标记,例如保留所有回调的 table 然后只存储 table索引。这将被认为是一个更清洁的解决方案。