gpt4 book ai didi

c++ - 编译时构造函数选择

转载 作者:行者123 更新时间:2023-11-27 23:47:33 29 4
gpt4 key购买 nike

我正在尝试实现以下 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 {...} 返回点或线类型取决于调用的是点构造函数还是线构造函数

我的第一个方法是使用 boost::variant,但我不知道如何获取 value_type 和实现 get() 方法。

第二次尝试是使用部分模板特化。但到目前为止,我没有成功。 wandbox example

有人可以建议如何实现所需 API 的方法吗?

最佳答案

在 C++17 中,您可以使用推导指南,因此您同时拥有 position_t<Point>position_t<Line>并根据参数constructor,选择正确的。

类似于:

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

关于c++ - 编译时构造函数选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49401296/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com