我想写一个通用接口。我需要一个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"; };
}
但我不知道???,???的类型。由于无法将虚拟与模板组合使用,我正在寻找一种优雅的方式。
是否有可能在编译时解决这个问题?
答案 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;
请参考这个答案:
答案 2 :(得分:0)
您的未知参数类型(???)闻起来像是他们还需要共享一个通用接口,以便为您的方法提供任何有用的信息。
这将以优雅的方式解决问题,但显然不是在编译时。