如何将存储在 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索引。这将被认为是一个更清洁的解决方案。
我正在将指向函数的指针存储为字符串:
//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索引。这将被认为是一个更清洁的解决方案。