簡體   English   中英

創建具有可變數量的成員的類型

[英]Creating a type with a variable number of members

通常,在編寫Vector類型時,我會執行以下操作:

template <typename Type>
struct Vector2{
    Type x;
    Type y;
};

...然后重復執行Vector3Vector4等。

這讓我感到奇怪,是否有更好的方法可以做到這一點? 例如,通過表達某種類型(例如模板)必須具有的成員數。 我不確定編譯器如何知道每個成員的命名方式,但只是想檢查一下我是否錯過了一個絕妙的技巧。

如果您的類型相同,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM