boost.Geometry 操作员
boost.Geometry operators
我想在 boost.Geometry 中使用运算符而不是 multiply_value、add_point、dot_product ...。我必须自己定义这些吗?
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
namespace bg = boost::geometry;
using Point = bg::model::point<double, 3, bg::cs::cartesian>;
using namespace bg;
void test()
{
const double z{2.0};
const Point a{1.0,2.0,-1.0};
// this doesn't compile:
// const Point b{z*a};
// const Point c{a+b};
// instead I have to do this:
Point b{a};
multiply_value(b, z);
Point c{5.0,1.0,0.0};
add_point(c, b);
}
官方Boost Geometry doc没有标明任何算术运算符(检查字母O)。
理论上,您应该能够自己定义包装器,但请记住,有两种加法或乘法方法:multiply_point
和multiply_value
.
template<typename Point1, typename Point2>
void multiply_point(Point1 & p1, Point2 const & p2)
和
template<typename Point>
void multiply_value(Point & p, typename detail::param< Point >::type value)
但是编译器可以互换参数类型,这意味着如果这两个函数具有相同的名称,它将不知道选择哪个。
这意味着您将必须选择进行乘法运算时要执行的操作,以及选择操作数的顺序, 这样编译器就不会产生歧义了。
下面是一个如何做到这一点的例子,以便 Point b{z * a}
编译:
// For multiply value
template<typename Point>
Point operator*(const Point & p, typename detail::param< Point >::type value) {
Point result{p};
multiply_value(result, value);
return result;
}
请注意,Point b{a * z}
将 无法使用此解决方案进行编译 ,Point c{a * b}
。
也不会
我想在 boost.Geometry 中使用运算符而不是 multiply_value、add_point、dot_product ...。我必须自己定义这些吗?
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
namespace bg = boost::geometry;
using Point = bg::model::point<double, 3, bg::cs::cartesian>;
using namespace bg;
void test()
{
const double z{2.0};
const Point a{1.0,2.0,-1.0};
// this doesn't compile:
// const Point b{z*a};
// const Point c{a+b};
// instead I have to do this:
Point b{a};
multiply_value(b, z);
Point c{5.0,1.0,0.0};
add_point(c, b);
}
官方Boost Geometry doc没有标明任何算术运算符(检查字母O)。
理论上,您应该能够自己定义包装器,但请记住,有两种加法或乘法方法:multiply_point
和multiply_value
.
template<typename Point1, typename Point2>
void multiply_point(Point1 & p1, Point2 const & p2)
和
template<typename Point>
void multiply_value(Point & p, typename detail::param< Point >::type value)
但是编译器可以互换参数类型,这意味着如果这两个函数具有相同的名称,它将不知道选择哪个。
这意味着您将必须选择进行乘法运算时要执行的操作,以及选择操作数的顺序, 这样编译器就不会产生歧义了。
下面是一个如何做到这一点的例子,以便 Point b{z * a}
编译:
// For multiply value
template<typename Point>
Point operator*(const Point & p, typename detail::param< Point >::type value) {
Point result{p};
multiply_value(result, value);
return result;
}
请注意,Point b{a * z}
将 无法使用此解决方案进行编译 ,Point c{a * b}
。