2016-04-25 7 views
1

Boost GeometryパッケージでR-treeを使用して空間インデックスを構築したいと思います。ポリゴン操作にサードパーティ製のライブラリを使用しているので、独自のBox(CRectangle)データ構造を使用したいと思います。Boost Geometry:テンプレートBOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES

まず、カスタムポイント/ボックスタイプの登録についてこのチュートリアルに従いました。 http://www.boost.org/doc/libs/1_55_0/libs/geometry/doc/html/geometry/reference/adapted/register/boost_geometry_register_box_2d_4values.html

次の(簡略化した)コードに到着しました。これは問題なく動作します。私は4の正しい領域を得ます。

#include <iostream> 
#include <boost/geometry.hpp> 
#include <boost/geometry/index/rtree.hpp> 
#include <boost/geometry/geometries/register/point.hpp> 
#include <boost/geometry/geometries/register/box.hpp> 

namespace bg = boost::geometry; 
namespace bgi = boost::geometry::index; 

struct dummy_pt 
{ 
    int x,y; 
}; 

class CRectangle 
{ 
private: 
    int xmin, xmax, ymin, ymax; 

public: 
    // implementation not shown. 
    int xmin(); 
    int ymin(); 
    int xmax(); 
    int ymax(); 
} 

BOOST_GEOMETRY_REGISTER_POINT_2D(dummy_pt, int, bg::cs::cartesian, x, y) 
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle, dummy_pt, xmin(), ymin(), xmax(), ymax()) 

int main(int argc, char** argv) 
{ 
    CRectangle x = bg::make<CRectangle>(0,0,2,2); 
    std::cout << "Area: " << bg::area(x) << std::endl; 
    return 0; 
} 

私の問題は、テンプレート化されている場合、どのようにCRectangleを登録しますか?私は BOOST_GEOMETRY_REGISTER_BOX_TEMPLATEDが(あり)知っているが、それは左下を()を必要とupperRight()関数

CRectangle<int> or CRectangle<double> 

を:それは、ここで

template <typename T> 
class CRectangle 
{ 
    public: 
    T xmin(); 
    T xmax(); 
    T ymin(); 
    T ymax(); 

    private: 
    T xmin,xmax,ymin,ymax; 
} 

で、私は使用することができます。私の場合、CRectangleクラスはサードパーティ製のライブラリから来ているので、これらのメソッドはありません。

私はサブクラスを作成してこれらの2つのメソッドを提供できますが、BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUESなどの簡単な方法でテンプレート化されたクラスを使用できるかどうかを知りたいですか?

ありがとうございます。ご提案ありがとうございます。

答えて

1

私はもっと調査をすべきだった。次のコードスニペットが機能しました!私はちょうど両方の可能性を登録しました:

BOOST_GEOMETRY_REGISTER_POINT_2D(dummy_pt, int, bg::cs::cartesian, x, y) 
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<int>, dummy_pt, xmin(), ymin(), xmax(), ymax()) 
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<double>, dummy_pt, xmin(), ymin(), xmax(), ymax()) 

int main(int argc, char** argv) 
{ 
    CRectangle<int> x = bg::make<CRectangle<int>> (0,0,2,2); 
    CRectangle<double> y = bg::make<CRectangle<double>> (0,0,3,3); 
    std::cout << "Area: " << bg::area(x) << std::endl; 
    std::cout << "Area: " << bg::area(y) << std::endl; 
    return 0; 
} 

ブルートフォースよりも優れた解決策があれば、私はまだ興味があります。

+0

マクロを展開するだけです。それは特性の(小さな)セットを定義します。部分テンプレートの特殊化を使用して、それらを一般的に定義します。ジョブが完了しました。 – sehe

+0

ありがとうございますが、テンプレートプログラミングではあまりよくありません。より明確にするための小さな例を教えてください。 – user4979733

+0

申し訳ありません。その場合、あなたの仕事はうまくいくようです。どうして私はあなたがしたくないことをしたいのですか?もしあなたが立ち往生したら、あなたはいつも具体的な質問をしてSOに来ることができます。 – sehe

関連する問題