我正在编写自己的反射库,这就是我面临的情景:
基类方法提供用于查询方法和调用它们的接口(因此是可变参数模板方法)
class Method : public INamedEntity
{
public:
...
template<typename... TArgs>
void Call(void* instance, TArgs&&... args) const
{
AnyType arguments[] = { args... };
size_t nArguments = sizeof...(TArgs);
_Call(instance, arguments, nArguments);
}
void Call(void* instance) const;
protected:
// This was supposed to be the link to the derived class
virtual void _Call(void* instance, AnyType arguments[], size_t count) const = 0;
};
肉和所有实现都在派生类中,它是模板化的(TMethod)并使用传入的类型推导出类似参数类型,正确的成员指针签名等内容。
template<typename TReturn, typename TClass, class... Args>
class TMethod<TReturn(TClass, Args...)> : public Method
{
typedef TReturn(TClass::*MethodPointer)(Args...);
public:
TMethod(MethodPointer method)
, m_pointer(method)
{}
...
protected:
void _Call(void* instance, AnyType arguments[], size_t count) const
{
/// ???
(((TClass*)instance)->*m_pointer)( _How to even call this_ );
}
private:
MethodPointer m_pointer;
const Type* m_clazz;
const Type* m_return;
HashedString m_name;
};
显然上面的代码不是我的目标,老实说,我不知道如何找到解决这个问题的方法。当然我并不是坚持将参数包扩展到数组并像这样传递它,因为我真的很喜欢目前的任何工作方法。您将如何从基类Call函数传递参数并将其以某种可用的方式路由到派生实现?
我对任何建议持开放态度,但我知道有可能创建一个大的if语句并在派生类中使用'n'个参数进行重载,但这似乎是我提出的最不优雅的解决方案现在
此外,我有人对这个问题有更好的称号请告诉我;)