Строки C-стиля как аргументы шаблона? [дубликат]

Если Вам установили Ваши настройки клавиатуры на установку "Visual C# 2005", хорды переключения и редактирования текста окна превосходны. Вы поражаете первую комбинацию Ctrl + Ключ, затем выпускаете и поражаете следующую букву.

  • Ctrl + E , C : Прокомментируйте Выделенный текст

  • Ctrl + E , U : не прокомментируйте Выделенный текст

  • Ctrl + W , E : Покажите Ошибочный Список

  • Ctrl + W , J : Покажите Обозреватель объектов

  • Ctrl + W , S : Покажите Проводник Решения

  • Ctrl + W , X : Покажите Панель инструментов

, которую я все еще использую F4 для показа области свойств, таким образом, я не знаю хорду для той.

, Если Вы переходите к пункту меню Tools> Customise и нажимаете кнопку Keyboard, он дает Вам список команд, которые можно искать, чтобы видеть, доступен ли ярлык, или можно выбрать "Сочетания клавиш Нажатия": текстовое поле и тестовые сочетания клавиш, которые Вы хотите присвоить, чтобы видеть, конфликтуют ли они.

Приложение: я просто нашел другого большим, что я думаю, что буду использовать вполне часто: Ctrl + K , S

открывается intellisense поле, спрашивая Вас, чем требуется окружить выделенный текст. Это точно, что мне требовались все те времена, я должен был обернуть блок в условное выражение или попытку/выгоду.

52
задан Muhammad Annaqeeb 10 February 2014 в 20:25
поделиться

5 ответов

Строковый литерал не может использоваться в качестве аргумента шаблона .

Обновление: в настоящее время, спустя несколько лет после того, как этот вопрос был задан и дан ответ, можно использовать строковые литералы как аргументы шаблона. В C ++ 11 мы можем использовать пакеты символов в качестве аргументов шаблона ( template ), и возможно передать литеральную строку в такой шаблон.

Это сработает, однако:

template <char const *str>
struct X
{
    const char *GetString() const
    {
         return str;
    }
};

char global_string[] = "String";

int main()
{
    X<global_string> x;
    cout<<x.GetString();
}
50
ответ дан 7 November 2019 в 09:22
поделиться

No. Согласно Стандарту C ++ 14.3.2 / 1:

Аргумент шаблона для параметра шаблона, не являющегося типом и шаблоном, должен быть одним из:
- интегральная константа-выражение целочисленного или перечислимого типа; или
- имя нетипового параметра-шаблона; или
- адрес объекта или функции с внешней связью, включая шаблоны функций и идентификаторы шаблонов функций, но исключая нестатические члены класса, выраженный как & id-expression, где & является необязательным, если имя относится к функции или массиву, или если соответствующий параметр шаблона является ссылкой; или
- указатель на член, выраженный, как описано в разделе 5.3.1.

Строки отсутствуют в списке.

2
ответ дан 7 November 2019 в 09:22
поделиться

Нет, вы не можете работать со строковыми литералами во время компиляции. Лучшее, что вы можете получить, - это странные многосимвольные литералы (например, 'abcd' ), которые используют некоторые синтаксические анализаторы времени компиляции. Они упомянуты в §2.13.2.1 :

Обычный символьный литерал, который содержит более одного символа c-char. многосимвольный литерал. Мультихарактерный ter литерал имеет тип int и значение, определяемое реализацией.

В C ++ 0x могут быть способы обойти эти ограничения, хотя с новыми строковыми литералами , Arctic Interactive содержит интересную статью по этому поводу.

]
5
ответ дан 7 November 2019 в 09:22
поделиться

Вы можете использовать адрес строки с внешней связью в качестве параметра шаблона, например:

template <const char** T> class My {
public:
    void do_stuff() {
      std::cout << "zzz";
    }
};

const char* str;

int main()
{
  My<&str> zz;
    zz.do_stuff();

    printf("Result: %d %d \n",  60 % 10 + 1, (60 % 10 ) + 1 );
}

1
ответ дан 7 November 2019 в 09:22
поделиться

C ++ не знает о строках. Он знает только о «массивах символов», и там литерал будет указателем на массив. Поэтому, если вы использовали бы «значение» вашей строки в качестве параметра шаблона, вы фактически использовали бы значение указателя.

-6
ответ дан 7 November 2019 в 09:22
поделиться
Другие вопросы по тегам:

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