Условные переменные на основе значения шаблона - PullRequest
0 голосов
/ 14 июля 2020

Я хочу создать общую структуру c (математика) Vector с размером, заданным в шаблоне.

Теперь я хочу сделать возможным доступ к значениям через x, y и z, но только если размер Vector достаточно велик.

Пример кода:

template <unsigned int s, typename T>
struct Vector {

  // Vector Data array
  T v[s];

  // Special vars
  T& x = v[0];
  T& y = v[1];
  T& z = v[2];

  Vector(): v{0} {}

  // some vector functions
};

Теперь рассмотрим следующее:


Vector<2, float> vf2;

// should be possible
vf2.x;
// should be impossible
vf2.z;

Vector<3, float> vf3;

// should both be possible
vf3.x;
vf3.z;

Часть vf2.z должна выдавать ошибку во время компиляции, и из-за функций я не хочу дублировать структуру Vector.

Кто-нибудь знает, как этого добиться?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 июля 2020

РЕДАКТИРОВАТЬ: Я нахожу гораздо более простой способ решить вашу проблему, так что вот ...

Прежде всего мне нужно кое-что узнать о дизайне вашего класса, это не очень хороший дизайн, если вы хотите все, чтобы быть publi c, используйте структуру, а не класс, во-вторых, если вы хотите что-то проверить, вам нужно написать для этого метод, например:

template <unsigned int s, typename T>
class Vector {
public:
  T v[s];
  T& x = v[0];
  T& y = v[1];
  T& z = v[2];
  int getSize(){
    return s;
   };
};

Затем в вашем драйвере вы делаете что-то вроде:

Vector<2, float> vf2;
if(vf2.getSize() > 2){
   vf2.x;
   vf2.z;
}
else{
   vf2.z
   cout << "x cannot be called because size is too small.";
}

// сделайте то же самое для остальных ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...