C++ 类专门化,不包含用作专门化模板参数的类的模板参数

C++ 类专门化,不包含用作专门化模板参数的类的模板参数,c++,templates,c++20,C++,Templates,C++20,我目前在一个地理库上工作,我希望有一个通用的向量类,可以用于lat/lng点和投影点 lat/lng点的方向由方位和长度描述,投影空间中的方向由2d向量和长度描述 因此,该类应该如下所示: template <typename T> struct vector { direction_t direction; lenght_t length; }; 并且对于latlng和point具有方向特性的专门化,而无需为latlng和point的每个可能模板参数定义专门化 我

我目前在一个地理库上工作,我希望有一个通用的向量类,可以用于lat/lng点和投影点

lat/lng点的方向由方位和长度描述,投影空间中的方向由2d向量和长度描述

因此,该类应该如下所示:

template <typename T>
struct vector {
    direction_t direction;
    lenght_t length;
};
并且对于latlng和point具有方向特性的专门化,而无需为latlng和point的每个可能模板参数定义专门化

我怎么能有这样的东西:

template <typename T>
struct direction_trait;


template <latlng>
struct direction_trait {
    using direction_t = double;
};
我不想添加与定义板条或点的标题方向相关的信息


在我写问题的时候,我已经找到了解决问题的方法,但是如果有一种更优雅的方法来解决这个问题,如果没有那个helper类,我很乐意知道它

我想到的解决方案是,使用一个只用于专门化的类的声明,使用trait=latlng\u trait;将该类的引用引用到latlng point的类主体;。然后,向量使用该别名来获取方向类型

latlng等级:

struct latlng_trait; // a declaration of a class solely used for template specialization

template <angle_unit T>
struct latlng {
    using trait = latlng_trait;

    …
}
latlng的专业化:

template <>
struct direction_trait<latlng_trait> {
    using direction_t = double;
};
矢量:

template <typename T>
struct vector {
    typename direction_trait<typename T::trait>::direction_t direction;
};

以下工作如您所愿:

包括//仅适用于测试中是否相同 使用角度单位=int;//就这样 样板 结构板条{ }; 样板 结构点{ }; 样板 结构方向与特征; 样板 结构方向特性{ 使用方向类型=双; }; 样板 结构方向特性{ 使用direction\u type=T;//或任何您想要的 }; 样板 结构向量{ 使用direction\u t=typename direction\u trait::direction\u type; 方向; }; //用法 静态资产std::是否相同; 静态资产std::是否相同; 静态资产std::是否相同;
struct latlng_trait; // a declaration of a class solely used for template specialization

template <angle_unit T>
struct latlng {
    using trait = latlng_trait;

    …
}
template <>
struct direction_trait<latlng_trait> {
    using direction_t = double;
};
template <typename T>
struct vector {
    typename direction_trait<typename T::trait>::direction_t direction;
};