Преобразование const char в std :: string для заголовка - PullRequest
0 голосов
/ 08 мая 2020

Я работаю с gnuplot.

В файле заголовка у меня есть следующая функция:

void PlotPath(Gnuplot& gp, const char* title, bool first_plot = true, bool last_plot = true);

Затем в файле cpp:

template <typename T>
void Path<T>::PlotPath(Gnuplot& gp, const char* title, bool first_plot, bool last_plot)
{
    std::vector<WaypointPath<T>> waypoints = GenerateWaypoints(5000);
    std::vector<std::pair<T, T>> plot_points(5000);

    for (size_t i = 0; i < waypoints.size(); ++i) {
        plot_points[i] = std::make_pair(waypoints[i].position[0], waypoints[i].position[1]);
    }

    if (first_plot) {
        gp << "plot" << gp.file1d(plot_points) << "with lines title '" << title << "',";
    } else {
        gp << gp.file1d(plot_points) << "with lines title '" << title << "',";
    }

    if (last_plot) {
        gp << std::endl;
    }
}

Вместо этого я хочу сделать использования const char * title, я хочу использовать std :: string title. Итак, я сделал следующее, и это работает, но мне было интересно, есть ли лучший способ решения этой задачи.

template <typename T>
void Path<T>::PlotPath(Gnuplot& gp, const char* title, bool first_plot, bool last_plot)
{
    std::vector<WaypointPath<T>> waypoints = GenerateWaypoints(5000);
    std::vector<std::pair<T, T>> plot_points(5000);

    // Convert const char * to std::string
    std::string string_title = title;

    for (size_t i = 0; i < waypoints.size(); ++i) {
        plot_points[i] = std::make_pair(waypoints[i].position[0], waypoints[i].position[1]);
    }

    if (first_plot) {
        gp << "plot" << gp.file1d(plot_points) << "with lines title '" << string_title << "',";
    } else {
        gp << gp.file1d(plot_points) << "with lines title '" << string_title << "',";
    }

    if (last_plot) {
        gp << std::endl;
    }
}

Здесь я конвертирую const char * в std :: string, создавая другая переменная. Но есть ли способ включить std::string title в сам аргумент функции?

То, что я сделал здесь, работает нормально, но я просто ищу более элегантный способ решения этой проблемы.

С нетерпением жду вас.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Сделайте свой аргумент std::string. std::string имеет конструктор, который принимает const char*, так что это не должно быть проблемой.

1 голос
/ 08 мая 2020

Нет необходимости конвертировать. Этот код работает отлично.

if (first_plot) {
    gp << "plot" << gp.file1d(plot_points) << "with lines title '" << title << "',";
} else {
    gp << gp.file1d(plot_points) << "with lines title '" << title << "',";
}
...