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などの簡単な方法でテンプレート化されたクラスを使用できるかどうかを知りたいですか?
ありがとうございます。ご提案ありがとうございます。
マクロを展開するだけです。それは特性の(小さな)セットを定義します。部分テンプレートの特殊化を使用して、それらを一般的に定義します。ジョブが完了しました。 – sehe
ありがとうございますが、テンプレートプログラミングではあまりよくありません。より明確にするための小さな例を教えてください。 – user4979733
申し訳ありません。その場合、あなたの仕事はうまくいくようです。どうして私はあなたがしたくないことをしたいのですか?もしあなたが立ち往生したら、あなたはいつも具体的な質問をしてSOに来ることができます。 – sehe