Используя шаблон - PullRequest
       7

Используя шаблон

0 голосов
/ 14 марта 2009

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

Мне нужно сделать это несколько раз по всей программе.

Так что я буду использовать шаблон.

template <string theString>
string strUpper( string theString )
{
    int myLength = theString.length();
    for( int sIndex=0; sIndex < myLength; sIndex++ )
    {
        if ( 97 <= theString[sIndex] && theString[sIndex] <= 122 )
        {
        theString[sIndex] -= 32;
        }
    }   
   return theString;
}

теперь только если шаблон работал! Какие-либо предложения? Идентификатор 'string' должен быть непосредственным флагом.

1 Ответ

7 голосов
/ 14 марта 2009

Вы, очевидно, говорите о C++ (тегов пока нет, поэтому я подумаю, что здесь C ++). Ну, вы, кажется, хотите сказать

В качестве аргументов моего шаблона я принимаю любой тип, который моделирует строку

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

Что вы можете сделать, это принять basic_string<CharT, TraitsT>, если вы хотите сохранить его универсальным, например, если вы хотите принять строки широких символов так же, как строки узких символов

template <typename CharT, typename TraitsT>
std::basic_string<CharT, TraitsT> strUpper(basic_string<CharT, TraitsT> theString ) {
    typedef basic_string<CharT, TraitsT> StringT;
    for(typename StringT::iterator it = theString.begin(); 
        it != theString.end(); 
        ++it) 
    {
        *it = std::toupper(*it, std::locale());
    }   
    return theString;
}

Он не будет принимать другие или пользовательские классы строк, которые тоже являются строками . Если вы хотите этого, держите его полностью свободным от того, что он принимает, а что нет

template <typename StringT>
StringT strUpper(StringT theString) {
    for(typename StringT::iterator it = theString.begin(); 
        it != theString.end(); 
        ++it) 
    {
        *it = std::toupper(*it, std::locale());
    }   
    return theString;
}

Вы должны будете сообщить пользователям этой библиотеки, какие функции и типы они должны предоставить, чтобы это работало. Компилятор не будет знать об этом контракте. Вместо этого он просто выдаст сообщения об ошибках, когда вызовет функцию с типом, который не является строкой. Часто вы найдете страницы с сообщениями об ошибках, и трудно найти реальную причину того, что идет не так. Предлагается функция Concepts для следующей версии стандартных исправлений, которые приятно.

Если вы не намеревались написать такую ​​обобщенную функцию, вы можете просто написать обычную функцию, подобную этой

std::string strUpper(std::string theString) {
    for(std::string::iterator it = theString.begin(); 
        it != theString.end(); 
        ++it) 
    {
        *it = std::toupper(*it, std::locale());
    }   
    return theString;
}

Если вы не намеревались изобрести эту функцию, чтобы изучить ее в первую очередь, но поскольку вы не нашли другого уже написанного алгоритма, посмотрите в библиотеку алгоритма строкового алгоритма boost . Тогда вы можете написать

boost::algorithm::to_upper(mystring);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...