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

Posted

技术标签:

【中文标题】Boost:创建一个返回变体的函数【英文标题】:Boost: create a function that returns a variant 【发布时间】:2012-10-06 20:31:42 【问题描述】:

我有一个任务是学习如何使用 boost::variant。我正在尝试创建一个要求用户创建形状类型的函数。然后创建请求的形状并将其分配给变体并返回它。我正在使用 switch 来完成此操作,但使用 default 语句时出现运行时错误。

我还收到来自编译器的警告:“警告 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;
       

【问题讨论】:

【参考方案1】:

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

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;

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Boost:创建一个返回变体的函数的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Python 返回一个不可复制对象的列表

返回变体的vba函数的“无效使用null”

boost::bind 返回一个函数对象,它是需要指针的函数的参数

如何使用变体创建几何图形

从 boost::threaded 成员函数中获取返回值?

VB的所有命令函数呢?非常之感谢!