私見、線交叉はオブジェクトを生成します、それが持っていることが正直である理由です
boost::variant<Empty, Point, Line> intersect(Line const & l1, Line const & l2)
とヘルパー関数のような
boost::optional<Point> getIntersectionPoint(Line const & l1, Line const & l2)
bool isParallel(Line const & l1, Line const & l2)
編集:
ブーストライブラリを使用したくない場合は、簡単にアナログを作成できます。
struct intersection_result_t
{
enum isec_t
{
isec_empty, isec_point, isec_line
}
intersection_result_t()
: type_(isec_empty)
{
new (storage_) Empty();
}
intersection_result_t(Empty const & e)
: type_(isec_empty)
{
new (storage_) Empty(e);
}
intersection_result_t(Point const & p)
: type_(isec_point)
{
new (storage_) Point(p);
}
...
intersection_result_t(intersection_result_t & ir)
: type_(ir.type_)
{
switch(ir.type_)
{
case isec_empty:
new (storage_) Empty(*static_cast<Empty*>(ir.storage_));
case ....
}
}
private:
void destroy()
{
switch(type_)
{
case isec_empty:
operator delete (static_cast<Empty*>(storage_), storage_);
case ....
}
}
private:
char storage_[MAX(sizeof(Empty), sizeof(Point), sizeof(Line))];
isec_t type_;
};
などなど、さらにいくつかのスイッチが必要です。または、テンプレートを使用できます。オプションの場合は、initialized_
代わりに使用type_
して建設状態を追跡します。