C++ 点数容器

C++ 点数容器,c++,templates,C++,Templates,我正在编写一个类,用于存储具有X、Y、Z坐标的点,其中点的特定定义是模板化的: template<class T> class Foo { void add_point(T point); } 模板 福班{ 无效添加_点(T点); } 我的类中的某些函数需要访问X、Y、Z组件。问题是点类型(由第三方库定义)没有任何公共接口来访问坐标。其中一些允许operator[]或operator(),另一些允许通过.x或.x()进行访问 解决这一问题的更好方法是什么?我是否应该添加另一个

我正在编写一个类,用于存储具有X、Y、Z坐标的点,其中点的特定定义是模板化的:

template<class T>
class Foo {
  void add_point(T point);
}
模板
福班{
无效添加_点(T点);
}
我的类中的某些函数需要访问X、Y、Z组件。问题是点类型(由第三方库定义)没有任何公共接口来访问坐标。其中一些允许
operator[]
operator()
,另一些允许通过
.x
.x()
进行访问


解决这一问题的更好方法是什么?我是否应该添加另一个模板参数和一个访问坐标的函数?或者我应该放弃并以我喜欢的格式保留3D点的内部副本吗?

创建一个模板函数类,其工作是使所有类型点之间的接口同质化

像这样:

#include <iostream>


// One kind of point
struct PointA
{
    double& operator[](int which) {
        return data[which];
    };
    double data[3];
};

// Another kind of point
struct PointB {
double& x() { return data[0]; }
double& y() { return data[1]; }
double& z() { return data[2]; }
double data[3];
};


// An object which homogenises interfaces
template<class Point>
struct get_coordinate {

    double& x() const {
        return get_x(p);
    }

    Point& p;
};

// some overloads

double& get_x(PointA& p) {
    return p[0];
}

double& get_x(PointB& p) {
    return p.x();
}


template<class Point>
struct Foo
{
    void add_point(Point point) { p = point; }

    double& x() {
        // call through the homogeniser
        return get_coordinate<Point>{p}.x();
    }

    Point p;
};

// test
int main()
{
    Foo<PointA> fa;
    fa.add_point(PointA{{1,2,3}});
    std::cout << fa.x() << std::endl;

    Foo<PointB> fb;
    fb.add_point(PointB{{1,2,3}});
    std::cout << fb.x() << std::endl;
}
#包括
//一种观点
结构点A
{
双精度运算符[](int-which){
返回数据[其中];
};
双数据[3];
};
//另一种观点
结构点B{
double&x(){返回数据[0];}
double&y(){返回数据[1];}
double&z(){返回数据[2];}
双数据[3];
};
//使接口同质化的对象
模板
结构获取坐标{
double&x()常量{
返回get_x(p);
}
Point&p;
};
//一些重载
double&get_x(点A&p){
返回p[0];
}
双点和双点(B点和p点){
返回p.x();
}
模板
结构Foo
{
void add_point(point point){p=point;}
double&x(){
//通过均质器呼叫
返回get_坐标{p}.x();
}
p点;
};
//试验
int main()
{
富发;
fa.add_点(PointA{{1,2,3});

std::cout如果没有太多变体,那么您可以对这四个variantsfree函数访问器重载中的每一个都使用模板专门化。投票失败的原因是什么?@ChronoTrigger投票失败是因为人们喜欢您展示您的尝试,否则他们会觉得他们是在为您编写代码,而不是在帮助您说到这里,我已经给了你一个答案。这项技术是经过尝试和测试的。例如,
boost::hash
可以为任何重载自由函数的类找到一个hash函数问题。不管怎么说,这没什么大不了的。我很感激你的回答,我认为这是一条路要走。