不同类型的通用接口
问题描述:
我想写一个通用接口。我需要一个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"; };
}
但我不知道???的类型,???。由于无法与模板结合使用虚拟化,因此我正在寻找一种优雅的方式。
是否有可能在编译时解决这个问题?
答
你可以用变量参数做到这一点。 在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);
答
此问题可能被标记为重复! 但是因为你说:“因为不可能......” 并问道:“编译时是否可以解决这个问题?”
请参考此答案:
答
您的未知参数类型(???)闻起来像他们还需要共享一个通用接口,以向您的方法提供任何有用的信息。
这将以优雅的方式解决问题,但显然不是在编译时。
请至少提供一个预期用途的完全具体示例。现在(没有这样的例子)投票结束,因为不清楚。 –