gpt4 book ai didi

c++ - 我怎样才能摆脱这个 reinterpret_cast,或者这种用法可以吗?

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

我有一个带有此签名的模板成员函数:

template<typename T> void sync(void (*work)(T*), T context);

它可以用一个指向函数的指针来调用,该函数接受类型为 T* 的参数。 . context传递给那个函数。实现是这样的:

template<typename T> void queue::sync(void (*work)(T*), T context) {
dispatch_sync_f(_c_queue, static_cast<void*>(&context),
reinterpret_cast<dispatch_function_t>(work));
}

它使用 reinterpret_cast<>它有效。问题是标准没有很好地定义它并且非常危险。我怎样才能摆脱这个?我试过 static_cast但这给了我一个编译器错误:

static_cast from void (*)(std::__1::basic_string<char> *) to dispatch_function_t (aka void (*)(void *)) is not allowed.

dispatch_function_t是 C 类型,与 void (*)(void*) 相同.


我不确定我是否足够清楚。什么dispatch_sync_f它会调用给定的回调函数并将给定的上下文参数传递给该回调函数。 (它在另一个线程上执行此操作,尽管这超出了这个问题的范围。)

最佳答案

static_cast 不支持的原因是因为它是可能不安全。而 std::string* 将隐式转换为a void*,两者不是一回事。正确的解决方法是为您的函数提供一个简单的包装类,它接受一个 void*,和 static_cast 将其返回到所需的类型,并传递地址这个包装函数到你的函数。 (实际上,在现代机器,你将摆脱 reinterpret_cast,因为所有指向数据的指针具有相同的大小和格式。是否要剪像这样的角落由你决定——但在情况下有道理的。我只是不相信这是其中之一,因为简单的解决方法。)

编辑:还有一点:您说 dispatch_function_t 是 C 类型。如果是这种情况,实际类型可能是 extern "C"void (*)(void*),您只能使用具有 "C" 的函数对其进行初始化> 联动。 (同样,您可能会逃脱它,但我使用的编译器中 "C""C++" 的调用约定不同。)

关于c++ - 我怎样才能摆脱这个 reinterpret_cast,或者这种用法可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8681349/

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