[英]Creating a type with a variable number of members
通常,在编写Vector
类型时,我会执行以下操作:
template <typename Type>
struct Vector2{
Type x;
Type y;
};
...然后重复执行Vector3
, Vector4
等。
这让我感到奇怪,是否有更好的方法可以做到这一点? 例如,通过表达某种类型(例如模板)必须具有的成员数。 我不确定编译器如何知道每个成员的命名方式,但只是想检查一下我是否错过了一个绝妙的技巧。
如果您的类型相同,则std::array
可能会有所帮助。 然后,您可以将访问器函数编写为自由函数,并在大小超出范围时获取静态断言。 如果您的类型不同,则可以使用std::tuple
代替std::array
。
#include <array>
#include <iostream>
namespace X {
template<typename T>
using Vector2 = std::array<T, 2>;
template<typename T>
using Vector3 = std::array<T, 3>;
// named accessors, you might want to make the accepted parameter more
// specific, e.g. std::array<T,I>
template<typename T>
decltype(auto) x(T&& t) { return std::get<0>(std::forward<T>(t)); }
template<typename T>
decltype(auto) y(T&& t) { return std::get<1>(std::forward<T>(t)); }
template<typename T>
decltype(auto) z(T&& t) { return std::get<2>(std::forward<T>(t)); }
}
int main()
{
X::Vector2<int> v = {1, 2};
// you can use [] syntax
std::cout << v[0] << " " << v[1] << std::endl;
// or named access
X::x(v) = 2;
X::z(v); // static assertion triggered
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.