如何解决这是否定义了lambda函数并将函数指针同时分配给一个值?
很多C ++代码对我来说还是很难理解。.
以下是dlib(http://dlib.net文件:dlib / external / pybind11 / include / pybind11 / pybind11.h)的代码段
这是类cpp_function
的成员函数定义,我没有试图理解代码(没有时间这样做。。。我在下面的*** this line!
注释行中无法理解语法。我了解lambda函数(未命名的函数),所以它是否将函数指针分配给rec->impl
,该函数以function_call &call
作为参数并返回handle
?因此,看起来就像定义一个函数,同时将函数指针分配给变量。询问后,现在看起来就这样了。请有人确认。
void initialize(Func &&f,Return (*)(Args...),const Extra&... extra) {
using namespace detail;
struct capture { remove_reference_t<Func> f; };
...
rec->impl = [](function_call &call) -> handle { // <=== *** this line!
cast_in args_converter;
/* Try to cast the function arguments into the C++ domain */
if (!args_converter.load_args(call))
return PYBIND11_TRY_NEXT_OVERLOAD;
/* Invoke call policy pre-call hook */
process_attributes<Extra...>::precall(call);
/* Get a pointer to the capture object */
auto data = (sizeof(capture) <= sizeof(call.func.data)
? &call.func.data : call.func.data[0]);
capture *cap = const_cast<capture *>(reinterpret_cast<const capture *>(data));
/* Override policy for rvalues -- usually to enforce rvp::move on an rvalue */
const auto policy = return_value_policy_override<Return>::policy(call.func.policy);
/* Function scope guard -- defaults to the compile-to-nothing `void_type` */
using Guard = extract_guard_t<Extra...>;
/* Perform the function call */
handle result = cast_out::cast(
std::move(args_converter).template call<Return,Guard>(cap->f),policy,call.parent);
/* Invoke call policy post-call hook */
process_attributes<Extra...>::postcall(call,result);
return result;
};
...
using FunctionType = Return (*)(Args...);
constexpr bool is_function_ptr =
std::is_convertible<Func,FunctionType>::value &&
sizeof(capture) == sizeof(void *);
if (is_function_ptr) {
rec->is_stateless = true;
rec->data[1] = const_cast<void *>(reinterpret_cast<const void *>(&typeid(FunctionType)));
}
}
解决方法
rec->impl = [](function_call &call) -> handle
创建一个lambda,该lambda接受一个类型为function_call
的参数并返回一个handle
,然后将其分配给rec->impl
。
由于lambda基本上是未命名的结构,因此它们也具有未命名的类型。由于rec->impl
很明显已经存在,因此没有在lambda类型上进行模板化,因此lambda在分配期间会转换为其他类型。 (请注意:此处可能是模板化和过载的operator=
)
通常可以使用lambda的类型是std::function
或函数指针,因为无状态lambda可以转换为函数指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。