我有一项任务,学习如何使用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;
}
}
答案 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
。