如何在模板参数中设置属性名称?

How to set attribute names in template parameters?

提问人:nowox 提问时间:4/24/2023 最后编辑:nowox 更新时间:4/24/2023 访问量:86

问:

我有一个向量类:

template <typename T>
class Vector2 {
    public:
      T x, y;
    Vector2(T x, T, y) : x{x}, y{y} {}
}

我希望根据上下文获得不同的访问器:

Vector2<float, x, y> xy;
xy.x = 42;

Vector2<float, u, v> uv;
uv.u = 42;

在 C++ 中可能这样的事情吗?更具体地说,这在 C++03 中可能吗?

上下文

我用 C++ 为 DC/DC 电压转换器开发嵌入式固件。我有不同的值,例如电压、电流......可以从三相电流 (u,v,w) 到两相静态 (a,b) 和 2 相旋转框架 (d, q) 进行一些转换。具有特定类型会更具可读性,例如:

using CurrentDQ = Vector2<float, d, q>
using CurrentAB = Vector2<float, a, b>
using Current3 = Vector<float, u, v, w>
C++ 模板 C++03

评论


答:

1赞 HolyBlackCat 4/24/2023 #1

你能做的最接近的是:

template <typename T>
struct ElemsUV {T u, v;};

template <typename T>
struct Vector : T {};

Vector<ElemsUV<float>> vec;

// Or:
// template <typename T, template <typename> class E> struct Vector : E<T> {};
// Vector<float, ElemsUV> vec;

你当然可以拆分成单独的结构,但对我来说,一个大的看起来更方便。uv

然后,这些结构将具有用于交互的统一接口,例如:Elems??Vector<...>

template <typename T>
struct ElemsUV
{
    T u, v;
    T &get_x() {return u;}
    T &get_y() {return v;}
};

并且内部仅使用 ,以访问该元素。Vectorget_x()get_y()

0赞 Joel 4/24/2023 #2

我不确定 C++03,但您可能必须使用不同的变量访问相同的数据。 你可以像这样创建你的灰泥:unions

template <typename T>
class Vector2 {
public:
    union
    {
        T x, u;
    };
    union
    {
        T y, v;
    };
    Vector2(T x, T y) : x{ x }, y{ y } {}
};

然后像这样访问数据:

Vector2<int> vec(1, 2);
vec.x;
vec.u;

它们将具有相同的值/地址。

评论

0赞 HolyBlackCat 4/24/2023
我曾经这样做过,但它会引起问题。例如,如果您使用非平凡的可破坏类型作为(例如),则需要显式析构函数,则不会编译。我现在确信最好的方法是.Tstd::stringVector2T x; T &u() {return x;}
0赞 463035818_is_not_an_ai 4/24/2023
“你可以有联合来访问具有不同变量的相同数据”通常不是,但我认为在这种情况下是的,尽管取决于是什么。T