使用参数数组通过指针调用函数

时间:2013-10-15 09:20:19

标签: c++ api oop variadic-functions

我正在编写自己的反射库,这就是我面临的情景:

基类方法提供用于查询方法和调用它们的接口(因此是可变参数模板方法)

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'个参数进行重载,但这似乎是我提出的最不优雅的解决方案现在

此外,我有人对这个问题有更好的称号请告诉我;)

1 个答案:

答案 0 :(得分:0)

你可能会发现this question我接受的答案,我前一段时间非常有用。