我正在尝试实现以下API:geojson::position_t<> point_1{ 10, 12 };geojson::position_t<> point_2( 11, 13 );geojson::position_t<> point_3(std::pair<int, int>(12, 14));geojson::position_t<> line_1{ geojson::position_t<>{ 100, 120 }, geojson::position_t<>{ 110, 130 } };geojson::position_t<> poly_1{ { geojson::position_t<>{ 100, 120 }, geojson::position_t<>{ 110, 130 }}, { geojson::position_t<>{ 101, 121 }, geojson::position_t<>{ 111, 131 }} };这个想法是让position_t 模板类具有以下属性:有一些内部value_type标识是点还是点线有构造函数,并使用SFINAE识别点类型还是可以基于传递给ctor的参数来创建线型有方法value_type get() const {...}返回点或线型取决于是调用点还是线ctor我的第一种方法是使用boost :: variant,但是我被困在如何获取value_type和实现get()方法上。第二次尝试是使用部分模板专门化。但是到目前为止,我还没有成功。wandbox example有人可以建议方法如何达到所需的API吗? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 在C ++ 17中,您可以使用推导的指南,因此您同时具有position_t<Point>和position_t<Line>并根据参数构造函数选择正确的指南。就像是:class Point{public: int x; int y;};class Line{public: Point start; Point end;};template <typename T> class position_t;template <>class position_t<Point>{public: position_t(int x, int y) : point{x, y} {} position_t(const std::pair<int, int>& p) : point{p.first, p.second} {} const Point& get() const { return point; }private: Point point;};template <>class position_t<Line>{public: position_t(const position_t<Point>& start, const position_t<Point>& end) : line{start.get(), end.get()} {} const Line& get() const { return line; }private: Line line;};然后演绎指南position_t(int, int) -> position_t<Point>;position_t(std::pair<int, int>) -> position_t<Point>;position_t(const position_t<Point>&, const position_t<Point>&) -> position_t<Line>;所以:geojson::position_t point_1{ 10, 12 }; // geojson::position_t<Point>geojson::position_t point_2( 11, 13 ); // geojson::position_t<Point>geojson::position_t point_3(std::pair<int, int>(12, 14)); // geojson::position_t<Point>geojson::position_t line_1{ // geojson::position_t<Line> geojson::position_t{ 100, 120 }, // geojson::position_t<Point> geojson::position_t{ 110, 130 } }; // geojson::position_t<Point>Demo (adsbygoogle = window.adsbygoogle || []).push({});
07-25 22:12
查看更多