covariance / contravariance 是跟繼承有密切關聯的產物,而且與語言規範有關。然而這邊雖然要講這兩項性質,實際上 C++ 的語言規範上是 invariance,因此若要達到類似效果,在 C++ 必須要在類別設計時就加以考量。
covariance / contravariance 簡單來說,就是在特性情況下,子型別與父型別之間能否接受互相轉換。這個特定情況舉例來說,就是放在 container 內的狀況。
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
typedef boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> point_t;
typedef boost::geometry::model::box<point_t> box_t;
// point should be in clockwise order
typedef boost::geometry::model::polygon<point_t> polygon_t;
int main()
{
const polygon_t p1 {{{0, 0}, {0, 2}, {2, 2}, {2, 0}, {0, 0}}};
const polygon_t p2 {{{0, 0}, {0, 3}, {3, 3}, {3, 0}, {0, 0}}};
printf("is overlap? %d\n", boost::geometry::overlaps(p2, p1));
return 0;
}
| 這張是在我宿舍前面的櫻花樹,剛好在我住的最後一周開始開花 |
| 這張是在大阪城公園拍的,櫻花樹下的步道還真的滿有 fu 的 |