我正在编写自己的反射库,这是我面临的场景:
基类 Method 提供接口用于查询有关方法的内容并调用它们(因此是可变参数模板方法)
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;
};
显然,上面的代码不是我的目标,老实说,我不知道如何找到解决这个问题的方法。当然,我并不坚持将参数包扩展为数组并像这样传递它,因为我现在真的很想要任何工作方法。您将如何处理从基类调用函数传递参数并以某种可用的方式将其路由到派生实现?
我愿意接受任何建议,但我知道在派生类中创建一个大的 if 语句并使用“n”个参数进行重载的可能性,但这似乎是我迄今为止提出的最不优雅的解决方案。
另外,我有人对这个问题有更好的标题,请告诉我;)