перегрузка оператора +, конкатенация

нужно выполнить конкатенацию 2 путей к папкам. У меня получается бесконечная рекурсия в строке с return:

#include <iostream>
#include <filesystem>
#include <string>

namespace fs = std::filesystem;

std::string operator+(const fs::path &set_folder, const fs::path &user_path) {
    return set_folder + user_path;
}

int main() {

    const fs::path user_path = "C:\\Users\\ys\17";

    fs::path set_folder;

    std::cout << "введите set_folder :";
    std::cin >> set_folder;

    fs::path res;

    res = user_path + set_folder;

    std::cout << res;

    return 0;
}

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Вы определили сложение путей через сложение путей. Рекурсия. Если определить через сложение строк, то рекурсии не будет:

std::string operator +(const fs::path &set_folder, const fs::path &user_path) {
    return set_folder.string() + user_path.string();
}

Ещё одна вещь. Программист вызывая c = a + b преполагает что у c, a и b одинаковый тип. В вашем случае это не так. Этот вариант более привычен:

fs::path operator +(const fs::path &set_folder, const fs::path &user_path) {
    return set_folder.native() + user_path.native();
}

В примере выше мне подсказали что native лучше string.

Тоже самое можно сделать не переходя к строкам. Тут я специально передал первый аргумент как копию, чтобы изменить его в функции:

fs::path operator +(fs::path set_folder, const fs::path &user_path) {
    set_folder += user_path;
    return set_folder;
}

И ещё одна вещь. fs::path поддерживает оператор / который объединяет пути. В отличие от простой конкатенации он добавляет разделитель, если это нужно. Обычно это нужно:

fs::path operator +(const fs::path &set_folder, const fs::path &user_path) {
    return set_folder / user_path;
}

Если вас устраивает как работает /, то оператор + не нужен:

// было res = user_path + set_folder;
// стало
res = user_path / set_folder;
→ Ссылка