不同类型的通用接口

问题描述:

我想写一个通用接口。我需要一个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"; }; 
} 

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

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

+2

请至少提供一个预期用途的完全具体示例。现在(没有这样的例子)投票结束,因为不清楚。 –

你可以用变量参数做到这一点。 在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); 

此问题可能被标记为重复! 但是因为你说:“因为不可能......” 并问道:“编译时是否可以解决这个问题?”

请参考此答案:

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

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

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