2012-05-14 3 views
0

На языке, где меня впервые познакомили, появилась функция repeat(), которая взяла строку и повторила ее n раз. Например, repeat ("hi", 3) дает результат "hihihi".Почему std :: string определяет умножение или литералы?

У меня было довольно много раз, что я использовал эту функцию, но, к моему ужасу, я никогда не нашел что-то похожее в 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;

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

+3

Держу я в курсе, что C++ не perl ... –

+0

Возможно, это не так, и я не упоминал об этом, но они постоянно делают C++ более удобным. Просто посмотрите на 'auto'. Они никогда не встречались с ними? – chris

+0

@fontanini, кроме '' 'зарезервированного суффикса, я бы увидел его намного более удобным, если бы он был там каждый раз, когда я хотел его использовать. – chris

ответ

4

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

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

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

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

+0

Мне просто интересно, что еще мог сделать оператор? – chris

+0

В частности, синтаксис литералов 'std :: string' потребует, чтобы компилятор смог построить допустимую строку' std :: string', поэтому ему нужно было бы узнать подробности его реализации. Теоретически это мешало бы, если бы вы захотели поменять другую реализацию стандартной библиотеки. Практически никто на самом деле этого не делает, но большое количество проектных решений на C++ освещены теоретическими, а не прагматическими соображениями. –

+0

Об этом использовании, я понимаю, что вы имеете в виду. Я никогда не думал об этом. Думаю, это могло бы иметь смысл с учетом контекста. @RussellBorogove, я вижу вашу мысль. – chris

1

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

+0

Это по-прежнему реальный шаг вниз от 's + = 3 * 'str' s;' на мой взгляд. Первый может быть кристально чистым, но последний вытекает довольно хорошо. – chris

+1

Невозможно перемножить строки, что значит на других языках, вне меня, AFIK вы не можете сделать это в C# или java. – johnathon

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^