Вопрос по c++, c++11, string – Почему std :: string не определяет умножение или литералы? [закрыто]

0

На языке, с которым я впервые познакомился, была функцияrepeat(), который взял строку, и повторил ееn раз. Например,repeat ("hi", 3) дает результат"hihihi".

У меня было довольно много раз, когда я использовал эту функцию, но, к моему ужасу, я никогда не находил ничего подобного в C ++. Да, я могу легко сделать свой собственный или сделать его проще в использовании, но я несколько удивлен, что он уже не включен.

Одно место, в которое это действительно хорошо вписалось бы, - этоstd::string:

std::string operator* (const std::string &text, int repeatCount);
std::string operator* (int repeatCount, const std::string &text);

Это позволило бы использовать такой синтаксис:

cout << "Repeating \"Hi\" three times gives us \"" << std::string("Hi") * 3 << "\"."

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

Каждый раз, когда мы используем строковые операторы, такие какoperator+, мы должны убедиться, что один аргумент на самом деле является строкой. Почему они просто не определили литерал для него, как""s? Буквальные суффиксы, не начинающиеся с подчеркивания, зарезервированы для реализации, так что это не должно противоречить тому, как это можно было бы добавить до того, как кто-то действительно начнет создавать свои собственные.

Возвращаясь к повторному примеру, синтаксис будет просто:

cout << "123"s * 3 + "456"s;

Это даст:

123123123456

В то же время, один для персонажей может быть включен, чтобы удовлетворитьcout << '1's + '2's;

Почему эти две функции не были включены? Они определенно имеют четкое значение и облегчают кодирование, но при этом используют стандартные библиотеки.

Я действительно не понимаю реалистичного варианта использования этогоconstructor # 2 уже не покрывает. В самом деле? В Реального код? ildjarn
@ fontanini, кромеs будучи зарезервированным суффиксом, я бы посчитал его более удобным, если бы он уже был там каждый раз, когда я хотел его использовать. chris
Может быть, это не то, на что я ссылался, но они постоянно делают C ++ более удобным для пользователя. Просто посмотрите наauto. Им никогда не приходило в голову? chris
Держите, я не возражаю, С ++ не является Perl . Cole Johnson
Это заговор. John Dibling

Ваш Ответ

2   ответа
4

такие языки, как Ruby, поставляются «с батарейками» и с «принципом наименьшего удивления». Они предназначены для того, чтобы иметь множество этих маленьких тонкостей в качестве функции сверх минимума. C ++ - это язык системного уровня, который предназначен быть «ближе к металлу», что совершенно очевидно в том, что astring даже не является базовым типом данных языка, а является дополнением, предоставляемым библиотекой. Даже FORTRAN имеет собственный строковый тип, так что вы можете видеть, как низкоуровневый C ++ позиционируется. Это сделано намеренно: что, если вы программируете встроенный чип с хранилищем 1 Кбайт и не используете строки? Только не включайте их.

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

Я могу подумать, что «123» * 3 может дать «369» - умножить любые цифры на 3. Я также предлагаю, чтобы эта интерпретация была «вменяемой», чтобы ваша интерпретация оператора повтора не была единственной однозначной интерпретацией.

Буквенное обозначение гораздо проще и понятнее:std::string является частью стандартной библиотеки, которая на один уровень абстракции выше самого синтаксиса языка. Другими словами, буквенная нотация будет проходить через уровень абстракции, который разделяет «возможности языка» и «библиотеку, которую вы можете ожидать связать с вашим компилятором».

Мне просто любопытно, что еще сделает оператор? chris
В частности, синтаксис дляstd::string литералы потребовали бы, чтобы компилятор мог создать действительныйstd::string, поэтому он должен был бы знать детали его реализации. Теоретически это может помешать, если вы захотите поменять другую реализацию стандартной библиотеки на практике. На практике никто никогда не делает этого, но очень много проектных решений на C ++ основаны на теоретических, а не прагматических соображениях. Russell Borogove
Об этом, я понимаю, что ты имеешь в виду. Я никогда не думал об этом. Я думаю, это может иметь смысл, учитывая контекст. @RussellBorogove, я понимаю твою точку зрения. chris
После использования более современных языков со встроенными типами строковых данных история развития C ++ выглядит как попытка добавить все функции, необходимые для реализации окончательного строкового типа данных «все для всех людей». Russell Borogove
@ Russell: я бы поспорилт понятия не имею о чем ты. Каждая разумная жалоба наstd::string Я видел, что ему не хватает функциональности, а не избытка. ildjarn
1

Там. Оно делает. Теперь, это работает для символьных литералов, так как для выполнения этого со строками нет способа сделать это декларативно. Также отметим, что класс std :: string не является языковым типом, строковая литеральная в c ++ - это const char *. Указатель Какие массивы распадаются на указатели, и вот как класс std :: string обрабатывает то, что он содержит, массив символов, то есть char, или wchar_t для std :: wstring. там на основе этих типов.

Это все еще настоящий шаг вниз отs += 3 * "str"s; я считаю. Первый может быть кристально чистым, но последний выглядит довольно хорошо. chris
Одна не может умножать строки, что это значит на других языках, вне моего понимания, AFIK, вы даже не можете сделать это в c # или java. johnathan
и вы должны помнить, что C ++ не является интерпретируемым языком, и им тоже не управляют. В синтаксисе языка есть много того, что позволяет ему быть как можно ближе к металлу, и в то же время сохранять очень быстрые и сильные абстракции вдали от машины, я имею в виду, да, вы можете крутить биты, если нужно, но в большинстве случаев это просто не нужно, и часто я вижу слишком сложный код, когда можно использовать хорошие конструкции c ++. Отметим, что вы, вероятно, можете достичь того, что вы хотите сделать, с помощью простого шаблона выражения. johnathan
@ chris: Какое реальное программное обеспечение может сделать что-то подобное? Это удобно? Конечно. Это нужно? Абсолютнон. ildjarn

Похожие вопросы