具有不同类型的通用接口

时间:2016-09-06 05:26:11

标签: c++

我想写一个通用接口。我需要一个std :: vector中不同对象的列表。每个对象都有另一种类型,但相同的界面。

例如:

struct Base
{
  std::string name;

  virtual void doWork(???, ???);
  virtual void print(???,???);
};

struct ObjA : Base
{
  void doWork(???,???) override
  {
      std::cout << "Hello\n";
  };
  void print(???,???) override
  {
     std::cout << "Hey\n";
  };
}

struct ObjB : Base
{
 void doWork(???,???) override { std::cout << "Hello\n"; };
 void print(???,??? ) override { std::cout << "Hey\n";   };
}

但我不知道???,???的类型。由于无法将虚拟与模板组合使用,我正在寻找一种优雅的方式。

是否有可能在编译时解决这个问题?

3 个答案:

答案 0 :(得分:1)

您可以使用变量参数执行此操作。 在Base中传递一个整数,表示您要传递的参数数量,然后是变量参数。 然后使用va_arg获取实际参数。

struct Base
{
    std::string name;

    virtual void doWork(int i, ...)
    {
    }
};

struct ObjB : Base
{
    void doWork(int i, ...) override 
    { 
        va_list ap;

        va_start(ap, i);

        int x = va_arg(ap, int);

        std::cout << x << std::endl;

        float f = va_arg(ap, float);

        std::cout << x << std::endl;

        va_end(ap);
    }
};

Base *base = new ObjB;

base->doWork(2, 10, 3.f);

答案 1 :(得分:0)

这个问题可以标记为重复! 但是因为你说:&#34;因为不可能......&#34; 并问:&#34;是否有可能在编译时解决这个问题?&#34;

请参考这个答案:

Can a C++ class member function template be virtual?

答案 2 :(得分:0)

您的未知参数类型(???)闻起来像是他们还需要共享一个通用接口,以便为您的方法提供任何有用的信息。

这将以优雅的方式解决问题,但显然不是在编译时。