Вы, очевидно, говорите о 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);