提升:创建一个返回变体的函数

时间:2012-10-06 20:31:42

标签: c++ boost switch-statement variant

我有一项任务,学习如何使用boost :: variant。我正在尝试创建一个函数,要求用户创建一个形状类型。然后创建请求的形状并将其分配给变体并返回它。我正在使用一个开关来实现这一点,但我在使用默认语句时遇到运行时错误。

我也从编译器收到警告:“警告C4715:'ShapeVariant':并非所有控制路径都返回一个值”

如果用户输入无效选择,我该如何打印字符串?

谢谢!

#include "boost/variant.hpp"

typedef boost::variant<Point,Line,Circle> ShapeType;

ShapeType ShapeVariant()
{
    cout << "Please select a Shape Type\n1: Point\n2: Line\n3: Circle\n\nSelection: ";

    int choice;

    cin >> choice;

    switch(choice)
    {
    case 1: return Point(); break;
    case 2: return Line(); break;
    case 3: return Circle(); break;
    default: cout << "Invalid selection." << endl; break;
    }   
}

2 个答案:

答案 0 :(得分:3)

不是从函数中打印字符串,而是抛出调用者捕获的异常并打印抛出异常的原因。

switch(choice)
{
  case 1: return Point(); break;
  case 2: return Line(); break;
  case 3: return Circle(); break;
  default: throw std::runtime_error( "Invalid selection." );
} 

在来电者中:

try {
  auto result = ShapeVariant();
} catch( std::exception const& e ) {
  std::cout << e.what() << std::endl;
}

答案 1 :(得分:0)

您不能在C ++中执行此操作,运行此类代码将导致无效情况下的未定义行为。如果选择真的无效,则抛出异常。您还可以查看专为此类案例设计的boost::optional