Каков наилучший способ обработки условного числа переменных-членов? - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь написать библиотеку C ++ для построения 2D или 3D данных. Моя идея состоит в том, чтобы иметь класс Plot, который содержит всю информацию, касающуюся осей, заголовка, легенды и так далее. Таким образом, Plot будет иметь член Axes, член Title, et c.

class Plot {publi c: plot () {...} private: Axes axes; Легенда легенда; ...}

Я хочу, чтобы API был настолько интуитивно понятным, насколько это возможно, чтобы его можно было использовать (простой пример) следующим образом:

int main() {
    std::vector<float> x_data { 1.0, 2.0, 3.0, 4.0, 5.0 };
    std::vector<float> y_data { 5.0, 3.0, 3.0, 3.0, 5.0 };
    std::vector<float> z_data { 8.0, 7.0, 1.0, 2.0, 3.0 };

    Plot plt;    // initializes a generic instance of a plot

    // The user can decide to plot 2D data
    plt.plot2D(x_data, y_data);            // only takes 2 input parameters

    // Or to plot 3D data
    plt.plot3D(x_data, y_data, z_data);    // takes 3 input parameters
}

Проблема (например) Plot 'Axes member.

В 2D-случае мне бы хотелось, чтобы Axes было примерно таким:

class Axes
{
public:
    Axes() {...}
    std::string getAxesInformation()
{
    // does something with axes x and y
}

private:
    Axis x;
    Axis y;
}

В то время как в 3D-случае мне бы хотелось, чтобы быть примерно таким:

class Axes
{
public:
    Axes() {...}
    std::string getAxesInformation()
{
    // does something with axes x, y AND z
}

private:
    Axis x;
    Axis y;
    Axis z;
}

Как мне обрабатывать другое количество переменных-членов? Конечно, можно сохранить bool, чтобы отслеживать существование z и прочего, но это не кажется идеальным.

Я бы хотел, чтобы z вообще не создавалось.

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете использовать указатель std :: unique для этого (это может гарантировать не создание экземпляра, а также простой способ проверить, был ли установлен элемент или нет):

class Axes
{
public:
    Axes(...)
    {}

    std::string getAxesInformation()
    {
      if(x)
       // do something with x
      if(y)
       // do something with y
      if(z)
        // do something with z
    }

private:
    std::unique<Axis> x;
    std::unique<Axis> y;
    std::unique<Axis> z;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...