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 に答える