Re[20]: Концепция умного C++
От: B0FEE664  
Дата: 30.04.25 16:59
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>>>А в чем проблема?

BFE>>Это отход от принципа "не платим за то, что не используем."
M>Так постоянно используется. Да и завершающий 0 — смешная плата
Это минимум одно присвоение на каждое добавление символа.

M>>>Завершающий ноль — для совместимости с сишными АПИ.

BFE>>Для совместимости было бы логично завести отдельный класс.
M>И туда-сюда конвертить?
Если надо.

M>А такая строка, без завершающего нуля — уже есть. Называется std::vector<char>

Это не строка: у него нет многих строковых методов find..., substr, compare, оператора сложения...
Опять же: вектор — не лучший выбор.

M>BSTR — это вообще частный случай строк в одной из технологий на одной из платформ.

Нет. Это просто название от MS, а сама методика хранения длины строки перед указателем пришла из UNIX, насколько я знаю.

M> Можешь сделать сам класс для BSTR. Хотя стоп, такие классы вроде уже есть в MFC/ATL. Не помню, правда, есть ли там конвертация в/из std::string. Можешь дописать

Написать то я могу всё что угодно, но проблема в том, что потом каждому сотруднику придётся это изучать, чтобы развивать код, а обычный программист ой как не любит изучать "велосипеды".

M>А зачем тебе отдельно С++ строка и С строка? Чтобы при вызове сишного АПИ было дополнительное преобразование?

А зачем мне C вызовы?

M>>>Не понял, когда это эта проблема с самого начала существовала? У вектора, у строк, у деки, у других контейнеров всегда была версия конструктора, принимающего count и значение элемента, которым надо заполнить. Никогда с этим не было никаких проблем.

В каком-то смысле — да, с самого начала. У конструктора с двумя параметрами очень сложная имплементация.

BFE>>Да, был не прав, конечно, у других контейнеров std конструкторы с двумя параметрами имеют ту же проблему: по виду x(a, b) который из двух конструкторов вызовется сказать нельзя — надо знать типы a и b. Разрешали и разрешают эту ситуацию с помощью метапрограммирования.

M>Надо просто запомнить, что первым аргументом идёт count, вторым — значение элемента. Так как у всех контейнеров это сделано единообразно, запомнить не так уж сложно. Также есть метод assign с такой же сигнатурой.
Всё несколько сложнее:
    std::vector<int> v1(5, 1);
    std::vector v2(v1.begin(), v1.end());
    std::vector v3{v1.begin(), v1.end()};

    const char* a = "a";
    const char* b = "b";
    std::vector<const char*> v4(a, b);
    std::vector<const char*> v5{a, b};
    std::vector              v6("a", "b");

Какого размера вектора v1 и v2 ?
Есть ли какие либо проблемы с векторами v4, v5 и v6?

M>Ни разу не приходилось использовать метапрограммирование для использования таких конструкторов. Зачем? Для чего?

метапрограммирование спрятано внутри, вы им пользуетесь, просто не знаете об этом.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.