gpt4 book ai didi

c++ - 如何从一个函数返回不同的类?

转载 作者:IT老高 更新时间:2023-10-28 23:22:13 25 4
gpt4 key购买 nike

我有一个问题,虽然它不限于 C++。如何从一个函数返回完全不同的类?

f() {

in case one: return A;
in case two: return B;
in case three: return C;


}

例如,我在空间中有两个球,根据位置和大小,两个球相交有三种情况,即不相交、在点、a和圆。如何在一个函数中返回不同的类?

谢谢。

最佳答案

如果您负担得起 Boost,那么这听起来像是 Boost.Variant 的完美应用程序。 .

struct NoIntersection {
// empty
};
struct Point {
// whatever
};
struct Circle {
// whatever
};

typedef boost::variant<NoIntersection, Point, Circle> IntersectionResult;

IntersectionResult intersection_test() {

if(some_condition){
return NoIntersection();
}
if(other_condition){
return Point(x, y);
}
if(another_condition){
return Circle(c, r);
}
throw std::runtime_error("unexpected");
}

然后您使用静态访问者处理您的结果:

 struct process_result_visitor : public boost::static_visitor<> {

void operator()(NoIntersection) {
std::cout << "there was no intersection\n";
}
void operator()(Point const &pnt) {
std::cout << "there was a point intersection\n";
}
void operator()(Circle const &circle) {
std::cout << "there was a circle intersection\n";
}
};

IntersectionResult result = intersection_test();
boost::apply_visitor(process_result_visitor(), result);

编辑:访问者类必须派生自 boost::static_visitor

更新:由我写的一些批评性评论提示 a little benchmark program .比较了四种方法:

  • boost::variant
  • union
  • 类层次结构
  • boost::any

这些是在我的家用计算机上,当我在 Release模式下使用默认优化 (VC08) 编译时的结果:

test with boost::variant took 0.011 microseconds

test with union took 0.012 microseconds

test with hierarchy took 0.227 microseconds

test with boost::any took 0.188 microseconds

使用 boost::variant 比 union 更快,并导致(IMO)最优雅的代码。我猜想类层次方法的性能极差是由于需要使用动态内存分配和动态分派(dispatch)。 boost::any 既不快速也不特别优雅,因此我不会考虑将它用于此任务(但它还有其他应用程序)

关于c++ - 如何从一个函数返回不同的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com