массив фиксированного размера для операторов в c ++ - PullRequest
0 голосов
/ 28 апреля 2020

Я пытался вот уже несколько часов. Я не могу найти способ передать массив фиксированного размера оператору. Я нашел кое-что здесь в stackoverflow и попробовал это таким образом, как вы можете видеть в моем коде, но это не будет работать вообще. Задача состоит в том, что код не должен быть скомпилирован, если массив не имеет размер 3, это означает, что, если массив имеет размер 2 или размер 4, я должен получить ошибку компиляции. Может кто-нибудь сказать мне, как это реализовать? Заранее спасибо! :)

class Vec3 {
private:
int x, y, z;
public:
Vec3 (int x, int y, int z) : x(x), y(y), z(z) {}
int getX () const
{
    return x;
}
int getY () const
{
    return y;
}
int getZ () const
{
    return z;
}
};

Vec3 operator+(Vec3 &vec, int (*arr)[3]) {
int x,y,z;
x = vec.getX() + (*arr)[0];
y = vec.getY() + (*arr)[1];
z = vec.getZ() + (*arr)[2];
Vec3 result(x,y,z);
return result;
}

int main () {
Vec3 v1 (1,2,3);
int  v3 [] = {2,4,6};

cout << "v1 + v3 = " << v1 + v3 << endl;

return 0;
}

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Синтаксис у вас немного неправильный. Вместо

Vec3 operator+(Vec3 &vec, int (*arr)[3])

для передачи массива по ссылке должно быть

Vec3 operator+(Vec3 &vec, int (&arr)[3])

. И вы можете отбросить значение оператора (*) перед доступом к массиву, так что вы получите

Vec3 operator+(Vec3 &vec, int (&arr)[3]) {
    int x,y,z;
    x = vec.getX() + arr[0];
    y = vec.getY() + arr[1];
    z = vec.getZ() + arr[2];

    Vec3 result(x,y,z);

    return result;
}
0 голосов
/ 28 апреля 2020

Используйте шаблон, чтобы сделать это:

template<size_t N>
Vec3 operator+(Vec3 &vec, int (&arr)[N]) {
    static_assert(N==3,"wrong size of array");
    // the rest of the code , small fix: arr[0] etc 

stati c assert будет срабатывать, когда N не равно 3.

Demo

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