1

我有一个任务是学习如何使用 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;
    }   
}
4

2 回答 2

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;
}
于 2012-10-06T20:37:03.867 回答
0

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

于 2012-10-06T20:35:43.470 回答