是否可以生成方法定义(具有确切数量的参数和已知类型的返回值),具有:
- 可变参数包中的方法参数类型“冻结”
- 推导方法返回类型
- 方法名称(传递给宏?)
细节:
我有一个简单的反射结构(为了便于阅读,省略了部分专业化的东西),它推导出成员函数的返回类型和参数类型:
template<typename RetType, typename ...ArgTypes>
struct reflect_method<RetType(HostClassType::*)(ArgTypes...)> {
using method_type = RetType;
using method_args = type_placeholder<ArgTypes...>;
using call_type = RetType(HostClassType::*)(ArgTypes...);
};
其中method_type
是方法返回类型,method_args
是方法参数类型“冻结”在辅助模板 structtype_placeholder
中。
我正在尝试做的是在生成的类中创建一个方法,该方法将反映参数和返回某个其他类的另一个方法的类型。创建的方法将为反射方法提供装饰。
伪代码实现:
#define RPCCLASS(class_name) class RPC##class_name : public class_name \
{ \
using SelfType = RPC##class_name; \
using ParentType = class_name;
#define RPCCLASS_END() };
#define RPCBIND(method_name) \
using method_name_##tag = reflect_method<decltype(ParentType::method_name)>; \
method_name_##tag::method_type
method_name(method_name_##tag::method_args::at<0>::type arg0, \
method_name_##tag::method_args::at<1>::type arg1, \
/* ... */ \
/*don't know how to put correct number of arguments here)*/) \
{ \
/* do some stuff */ \
/* ... */ \
/* invoke the reflected method */ \
return Invoke<method_name_##tag>::apply(this, method_name, \
arg0, \
arg1 \
/*again don't know how to put correct number of arguments here)*/) \
}
// USAGE:
class MyOwnClass {
public:
virtual long long doFun(int a, char b, const std::string& c);
};
RPCCLASS(MyOwnClass)
RPCBIND(doFun)
RPCCLASS_END()