C ++, как проверить условие перед использованием списка инициализаторов? - PullRequest
1 голос
/ 31 мая 2019

Я пишу фрагмент кода, который структурирован таким образом:

//field.h
class Field {
    std::vector<std::vector<double>> data;

    public:
    Field(int, int);        
};
Field::Field (int dim0, int dim1) :: data(dim0, std::vector<double>(dim1, 0)) { }

Затем я использую это поле в другом классе, например:

//approx.h
class Field;
class Approx {
    Field SWAP;

    public:
    Approx(int, int);
};
Approx::Approx (int size, int dim) { }
/*I want to initialise SWAP like this:
     if (size > dim) SWAP(size, dim)
     else SWAP(dim, size)
*/

Я не знаю, каксделать это.Я полагаю, это невозможно без списков инициализатора?Могу ли я даже спросить внутри списка инициализатора эти вопросы?

Если есть другой способ сделать это, я был бы благодарен за любой тип решения.

Ответы [ 4 ]

3 голосов
/ 31 мая 2019

Есть несколько способов решить эту проблему.Во-первых, вы можете просто использовать std::min и std::max, чтобы получить правильные значения, такие как

Approx::Approx (int size, int dim) : SWAP(std::max(dim, size), std::min(dim, size)) {}

Во-вторых, вы можете написать лямбда и сразу вызвать его как

Approx::Approx (int size, int dim) : SWAP([](auto size, auto dim){ if (size > dim) return Field(size, dim); else return Field(dim, size); }(size, dim)) {}

Если вам не нравится иметь код в списке инициализации, вы можете превратить его в приватную статическую функцию и вместо этого вызвать функцию.

3 голосов
/ 31 мая 2019

Разве нельзя использовать std :: min и max?

class Field;
class Approx {
Field SWAP;

public:
Approx(int, int);
};
Approx::Approx (int size, int dim): SWAP(std::max(size,dim), std::min(size,dim))
{ }
1 голос
/ 31 мая 2019

Другой способ использования делегирующего конструктора:

class Approx
{
private:
    Field SWAP;

private:
    explicit Approx(std::pair<const int&, const int&> p) : SWAP(p.second, p.first) {}

public:
    Approx(int size, int dim) : Approx(std::minmax(size, dim) {}

    // ...
};
0 голосов
/ 31 мая 2019

Вы также можете использовать std::unique_ptr для инициализации переменных-членов в теле конструктора, например:

class Approx {
    std::unique_ptr<Field> SWAP {nullptr};

public:
    Approx(int, int);
};

Approx::Approx (int size, int dim) {
    if (size > dim) {
        SWAP = std::make_unique<Field>(size, dim);
    } else {
        SWAP = std::make_unique<Field>(dim, size);
    }
}
...