【发布时间】:2020-10-31 20:04:28
【问题描述】:
假设我想要一个通用函数F 接受Args 类型的参数并返回R。我想包装这个函数,使其适合表单:
using gen_type = void (*)(struct value *values,
size_t num_args,
struct value *return_value)
我还有与通用 struct value 相互转换的函数:
template<T> T from_value(struct value);
// or have something like from_value_(struct value, int&)
// called from from_value
template<> from_value<int>(struct value);
struct value to_value(int i);
现在,我可以有这样的功能吗:
template<typename F, typename ... Args>
gen_type wrap(F func) {
return [](struct value *values,
size_t num_args,
struct value *return_value) {
if (num_args != sizeof...(Args)) { /* error */ }
auto res = func(/* apply from_value<> to each argument type */)
*return_value = to_value(res);
}
}
问题是评论在哪里应该怎么写。
(附带问题:有什么方法可以避免在调用wrap 时必须描述 F 的参数类型?)
【问题讨论】:
-
你可以使用外部库吗?如果是,那么有几种方法可以在Boost.Hana 的帮助下完成。
-
为什么要将 C 风格的结构与现代 C++ 混合?
-
不会飞。您的 lambda 需要捕获
func,但带有捕获的 lambda 不能转换为普通函数指针。gen_type不够大,无法存储任意可调用对象。 -
如何拨打
func;这可以通过辅助函数和std::make_index_sequence轻松完成 -
Re: 避免描述
F的类型。一般不会,因为一个可调用对象可能有多个operator()的重载,或者operator()可能是一个函数模板。是的,如果您将自己限制在纯函数指针和/或只有一个非模板operator()的类。
标签: c++ c++14 variadic-templates