Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

Преобразование типа функции (метода) - C++

26.12.2013, 18:30. Просмотров 322. Ответов 3
Метки нет (Все метки)

Задача заставить код работать (:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <string>
#include <cctype>
 
int main()
{
    std::string raw = "ljasdf 98oUF 9o*&UFifyo fadfu87Tf78PY)F987YfYf76%Tf987";
    using namespace std::placeholders;
    std::cout << (raw.size() - std::count_if(raw.begin(), raw.end(), 
        reinterpret_cast<std::function<bool(char)>>(std::isalnum));
    
    return EXIT_SUCCESS;
}
Bash
1
2
3
4
5
6
7
8
9
10
11
D:\Projects\c++\help>make
g++ cyberforum.cpp -o run.exe -std=c++11 -I"%BOOST_HOME%" -L"%BOOST_HOME%\lib"
cyberforum.cpp: In function 'int main()':
cyberforum.cpp:13:59: error: overloaded function with no contextual type informa
tion
   reinterpret_cast<std::function<bool(char)>>(std::isalnum));
                                                           ^
cyberforum.cpp:13:61: error: expected ')' before ';' token
   reinterpret_cast<std::function<bool(char)>>(std::isalnum));
                                                             ^
make: *** [i>?all] Error 1
В данном случае я хочу напрямую преобразовать возвращаемый тип std::isalnum с int к bool без использования лямбд.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2013, 18:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование типа функции (метода) (C++):

Преобразование типа при вызове виртуального метода через указатель на базовый класс - C++
Доброго времени суток. Наткнулся на вот такой вопрос в сети и пока что не смог на него ответить, может быть у Вас получится: В каких...

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа - C++
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать метод возвращающий указатель на нужное...

Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? - C++
Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? Вернее сказать, в дополнение к типу...

Преобразование типа или преобразование типа указателя ? - C++
Добрый день. Помогите пожалуйста понять что делает вот эта команда: out.write ((char *) &amp;n, sizeof n); Она что, перед записью в файл...

Преобразование типа - C++
Есть числа типов int и double. Их надо преобразовать в тип char, чтобы записать их в поток(файл *.bin). И какая функция соединяет...

Преобразование типа - C++
Есть две переменные: CString m_strVal; long m_lVal; Как c помощью MFC преобразовать тип long в CString, чтобы можно было...

3
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
26.12.2013, 20:06 #2
В студии VS2012 норм даже так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <string>
#include <cctype>
 
int main()
{
    std::string raw = "ljasdf 98oUF 9o*&UFifyo fadfu87Tf78PY)F987YfYf76%Tf987";
    using namespace std::placeholders;
 
    std::cout << raw.size() - std::count_if(raw.begin(), raw.end(),  std::isalnum); // 7 
 
    return EXIT_SUCCESS;
}
Вывод 7


Хотя Intellisense подсвечивает std::isalnum как int __cdecl isalnum (int _C)

Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <string>
#include <cctype>
 
int main()
{
    std::string raw = "ljasdf 98oUF 9o*&UFifyo fadfu87Tf78PY)F987YfYf76%Tf987";
 
    std::cout << ( raw.size() - std::count_if(raw.begin(), raw.end(), std::ptr_fun <int, int> ( std::isalnum ) )) ; // 7 
 
    return EXIT_SUCCESS;
}
1
Qwertiy
821 / 629 / 75
Регистрация: 20.08.2013
Сообщений: 2,524
26.12.2013, 21:43 #3
Цитата Сообщение от outoftime Посмотреть сообщение
Задача заставить код работать (:
Всё просто:
C++
1
std::cout << (raw.size() - std::count_if(raw.begin(), raw.end(), std::isalnum));
А 7 - т. к. вычитание из размера даёт количество небуквенноцифровых символов.
Count же объявлен с отдельным типом для предиката и ничего конвертировать не нужно:
C++
1
2
3
4
template<class _InIt,
    class _Pr> inline
    typename iterator_traits<_InIt>::difference_type
        count_if(_InIt _First, _InIt _Last, _Pr _Pred)
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
26.12.2013, 22:27  [ТС] #4
А вот и ответ:

В библиотеке <cctype> есть функция isalnum http://www.cplusplus.com/reference/cctype/isalnum/ которая не находится в пространстве имен std

В это же время в библиотеке <locale> есть функция std::isalnum http://www.cplusplus.com/reference/locale/isalnum/ которая находится в пространстве имен std

Если посмотреть сигнатуру std::isalnum
C++
1
2
template <class charT>
  bool isalnum (charT c, const locale& loc);
Мы увидим что ей надо передать локаль в качестве обязательного параметра. Следовательно и решений проблемы существует 2.

Первое с isalnum
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
 
int main()
{
    std::string raw = "ljasdf 98oUF 9o*&UFifyo fadfu87Tf78PY)F987YfYf76%Tf987";
    std::cout << (raw.size() - std::count_if(raw.begin(), raw.end(), isalnum));
    
    return EXIT_SUCCESS;
}
Второе с std::isalnum
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
#include <functional>
#include <string>
#include <locale>
 
int main()
{
    std::string raw = "ljasdf 98oUF 9o*&UFifyo fadfu87Tf78PY)F987YfYf76%Tf987";
    using namespace std::placeholders;
    std::function<bool(char)> check = std::bind(std::isalnum<char>, _1, std::locale("C"));
    std::cout << (raw.size() - std::count_if(raw.begin(), raw.end(), check));
 
    return EXIT_SUCCESS;
}
Второй вариант немного громоздкий из-за того что нужно передавать локаль, но все равно не на много хуже. Я явно определил тип переменной check, что-бы было понятней, но в дальнейшем лучше оставить это компилятору и определять тип как auto.

Добавлено через 4 минуты
Еще хотел добавить, что не смотря на то что сигнатура isalnum с <cctype> следующая
C++
1
int isalnum ( int c );
В этом месте
C++
1
std::cout << (raw.size() - std::count_if(raw.begin(), raw.end(), isalnum));
Возвращаемое значение успешно приводится к логическому типу.
1
26.12.2013, 22:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2013, 22:27
Привет! Вот еще темы с ответами:

Преобразование типа - C++
class ne { public: ne(); ~ne(); double x1; char l; }; ne O; ne::~ne(){};

Неявное преобразование типа - C++
Привет. Решаю задачу, не могу решить проблему. Есть класс 'time' и производный от него класс 'interval'. 1 - содержит поля h, m, s,...

Преобразование типа переменной - C++
Как сделать что бы компилятор не отслеживал преобразование типов переменных Конкретней на примере: #include &lt;iostream&gt; #include...

Преобразование пользовательского типа, friend - C++
Этот код не работает, потому что класс X ничего не знает о классе Y? Ошибки:Error 5 error C2679: binary '=' : no operator found which...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru