C++ 变量几何算法断言失败

C++ 变量几何算法断言失败,c++,boost,boost-geometry,C++,Boost,Boost Geometry,我想要一个地理区域几何图形的std::vector。其中一些区域是连续的,并由多边形表示。有些区域是不连续的,由多个多边形表示。我的计划是使用std::vector来处理这种差异 polygon和multipolygon都满足了几何概念,因此我们应该能够调用任意一个的信封。这是可行的,但我似乎无法在变体上调用信封 我不认为这与此有关,因为我使用的是boost版本1.55.0 注释行后面的if语句是可行的,但它看起来像是一个黑客。有没有一种方法可以让它在不枚举变量中的不同类型的情况下工作?您可以使

我想要一个地理区域几何图形的
std::vector
。其中一些区域是连续的,并由多边形表示。有些区域是不连续的,由多个多边形表示。我的计划是使用
std::vector
来处理这种差异

polygon
multipolygon
都满足了几何概念,因此我们应该能够调用任意一个的信封。这是可行的,但我似乎无法在
变体上调用
信封

我不认为这与此有关,因为我使用的是boost版本1.55.0


注释行后面的if语句是可行的,但它看起来像是一个黑客。有没有一种方法可以让它在不枚举变量中的不同类型的情况下工作?

您可以使用
boost::static\u visitor
创建一个多态函数,对变量进行调度:

static const envelope_ generic_envelope { };
// ...


generic_envelope(county,bb);
其中
信封
定义为:

struct envelope_ : boost::static_visitor<void> {
    template <typename... T> //dispatch
    void operator()(boost::variant<T...> const& v, box& bb) const {
        boost::apply_visitor(boost::bind(*this, ::_1, boost::ref(bb)), v);
    }

    template <typename T> // relay
    void operator()(T const& v, box& bb) const {
        bg::envelope(v, bb);
    }
};
结构信封:boost::static\u访问者{ 模板//发送 void操作符()(boost::variant const&v,box&bb)const{ boost::apply_visitor(boost::bind(*this,::_1,boost::ref(bb)),v); } 模板//中继 void运算符()(T常量和v、长方体和bb)常量{ bg::信封(v,bb); } };
查看它

完整程序 供日后参考:

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>

#include <boost/variant.hpp>
#include <boost/bind.hpp>

namespace bg = boost::geometry;

typedef bg::model::point<double, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef bg::model::polygon<point, true, true> polygon; //cw, closed polygon
typedef bg::model::multi_polygon<polygon> multipolygon;
typedef boost::variant<polygon,multipolygon> star_polygon;

struct envelope_ : boost::static_visitor<void>
{
    template <typename... T> //dispatch
    void operator()(boost::variant<T...> const& v, box& bb) const {
        boost::apply_visitor(boost::bind(*this, ::_1, boost::ref(bb)), v);
    }

    template <typename T> // relay
    void operator()(T const& v, box& bb) const {
        bg::envelope(v, bb);
    }
};

int main(void){
    static const envelope_ generic_envelope { };

    polygon staunton_county;
    bg::read_wkt("POLYGON ((-79.091666 38.132142, -79.09711 38.184771,"
        " -79.02301 38.195777, -79.049779 38.121112, -79.091666 38.132142))",
        staunton_county);

    multipolygon dickson_county;
    bg::read_wkt("MULTIPOLYGON (((-87.151995 36.289037, -87.146906 36.293344,"
        " -87.144172 36.292142, -87.142315 36.294607, -87.139332 36.292418,"
        " -87.14237199999999 36.290684, -87.151995 36.289037)),"
        " ((-87.20424199999999 35.959186, -87.53453 35.993074,"
        " -87.56679800000001 36.177857, -87.513533 36.334713,"
        " -87.286501 36.321933, -87.17730299999999 36.314145,"
        " -87.14987600000001 36.176878, -87.182573 36.049726,"
        " -87.20424199999999 35.959186)))",
        dickson_county);

    box bb;
    bg::envelope(staunton_county,bb);
    std::cout << bg::dsv(bb) << std::endl;

    bg::envelope(dickson_county,bb);;
    std::cout << bg::dsv(bb) << std::endl;

    star_polygon county;
    county = staunton_county;
    generic_envelope(county,bb);

    std::cout << bg::dsv(bb) << std::endl;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
名称空间bg=boost::geometry;
typedef bg::model::point;
typedef bg::model::box;
typedef bg::model::polygon polygon//闭多边形
typedef bg::model::multi_多边形multipolygon;
typedef boost::variant star_多边形;
结构信封:boost::static\u访问者
{
模板//发送
void操作符()(boost::variant const&v,box&bb)const{
boost::apply_visitor(boost::bind(*this,::_1,boost::ref(bb)),v);
}
模板//中继
void运算符()(T常量和v、长方体和bb)常量{
bg::信封(v,bb);
}
};
内部主(空){
静态常数包络{泛型{};
斯汤顿乌县;
bg::read_wkt(“多边形(-79.091666 38.132142,--79.09711 38.184771,”
" -79.02301 38.195777, -79.049779 38.121112, -79.091666 38.132142))",
斯汤顿尤县);
多边形迪克森县;
bg::read_wkt(“多多边形((-87.151995 36.289037,--87.146906 36.293344,”
" -87.144172 36.292142, -87.142315 36.294607, -87.139332 36.292418,"
" -87.14237199999999 36.290684, -87.151995 36.289037)),"
" ((-87.20424199999999 35.959186, -87.53453 35.993074,"
" -87.56679800000001 36.177857, -87.513533 36.334713,"
" -87.286501 36.321933, -87.17730299999999 36.314145,"
" -87.14987600000001 36.176878, -87.182573 36.049726,"
" -87.20424199999999 35.959186)))",
迪克森县);
框bb;
bg::信封(斯丹顿尤县,bb);

std::你看起来只是包含boost变量定义的转发声明。你能在上面的代码段中包含include语句吗?@dma你完全正确。我忘了包含boost/variant.hpp。我现在收到一个新错误,所以我将更新帖子。如果它与你相关:.c++1y会吗如果为它更新了
boost::apply\u visitor
,那么就可以让它更加简洁。。。
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>

#include <boost/variant.hpp>
#include <boost/bind.hpp>

namespace bg = boost::geometry;

typedef bg::model::point<double, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef bg::model::polygon<point, true, true> polygon; //cw, closed polygon
typedef bg::model::multi_polygon<polygon> multipolygon;
typedef boost::variant<polygon,multipolygon> star_polygon;

struct envelope_ : boost::static_visitor<void>
{
    template <typename... T> //dispatch
    void operator()(boost::variant<T...> const& v, box& bb) const {
        boost::apply_visitor(boost::bind(*this, ::_1, boost::ref(bb)), v);
    }

    template <typename T> // relay
    void operator()(T const& v, box& bb) const {
        bg::envelope(v, bb);
    }
};

int main(void){
    static const envelope_ generic_envelope { };

    polygon staunton_county;
    bg::read_wkt("POLYGON ((-79.091666 38.132142, -79.09711 38.184771,"
        " -79.02301 38.195777, -79.049779 38.121112, -79.091666 38.132142))",
        staunton_county);

    multipolygon dickson_county;
    bg::read_wkt("MULTIPOLYGON (((-87.151995 36.289037, -87.146906 36.293344,"
        " -87.144172 36.292142, -87.142315 36.294607, -87.139332 36.292418,"
        " -87.14237199999999 36.290684, -87.151995 36.289037)),"
        " ((-87.20424199999999 35.959186, -87.53453 35.993074,"
        " -87.56679800000001 36.177857, -87.513533 36.334713,"
        " -87.286501 36.321933, -87.17730299999999 36.314145,"
        " -87.14987600000001 36.176878, -87.182573 36.049726,"
        " -87.20424199999999 35.959186)))",
        dickson_county);

    box bb;
    bg::envelope(staunton_county,bb);
    std::cout << bg::dsv(bb) << std::endl;

    bg::envelope(dickson_county,bb);;
    std::cout << bg::dsv(bb) << std::endl;

    star_polygon county;
    county = staunton_county;
    generic_envelope(county,bb);

    std::cout << bg::dsv(bb) << std::endl;
}