提问人:nowox 提问时间:4/24/2023 最后编辑:nowox 更新时间:4/24/2023 访问量:86
如何在模板参数中设置属性名称?
How to set attribute names in template parameters?
问:
我有一个向量类:
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>
答:
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;
你当然可以拆分成单独的结构,但对我来说,一个大的看起来更方便。u
v
然后,这些结构将具有用于交互的统一接口,例如:Elems??
Vector<...>
template <typename T>
struct ElemsUV
{
T u, v;
T &get_x() {return u;}
T &get_y() {return v;}
};
并且内部仅使用 ,以访问该元素。Vector
get_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
我曾经这样做过,但它会引起问题。例如,如果您使用非平凡的可破坏类型作为(例如),则需要显式析构函数,则不会编译。我现在确信最好的方法是.T
std::string
Vector2
T x; T &u() {return x;}
0赞
463035818_is_not_an_ai
4/24/2023
“你可以有联合来访问具有不同变量的相同数据”通常不是,但我认为在这种情况下是的,尽管取决于是什么。T
评论