namespace gravity {
template<class T> struct value {};
// for brevity and deduction:
template<class T> T get(const gravity_value_t &v)
{return value<T>::get(v);}
template<class T> gravity_value_t put(const T &t)
{return value<T>::put(t);}
template<> struct value<int> {
int get(const gravity_value_t &v)
{return VALUE_AS_INT(v);}
gravity_value_t put(int i)
{return VALUE_FROM_INT(i);}
};
// more specializationsâ¦
template<class R,R f()>
void wrap(gravity_vm* vm,
gravity_value_t* args, uint32_t nargs,
uint32_t retIndex, void* data) {
assert(nargs==0);
gravity_vm_setslot(vm,put(f()),retIndex);
}
template<class R,class A,R f(A)>
void wrap(gravity_vm* vm,
gravity_value_t* args, uint32_t nargs,
uint32_t retIndex, void* data) {
assert(nargs==1);
gravity_vm_setslot(vm,put(f(get<A>(args[0]))),retIndex);
}
// more overloads with more argumentsâ¦
/*gravity_register*/(wrap<int,int,int,add>);
}
像往常一样,
void
返回类型将是一个痛苦;你得重复一遍
的参数计数重载
R
属于
无效
可以使用演绎法,以避免在使用时重复签名
wrap
,但随后会得到更少的函数和额外的闭包对象来区分它们(您可以通过
data
参数)。