Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Avgust
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
1

Узнать тип, на который указывает итератор

26.05.2016, 15:49. Просмотров 1636. Ответов 10
Метки нет (Все метки)

Всем привет! Вот например у меня есть такой код:
C++
1
2
3
4
5
6
vector<double> objInt2;
        objInt2.push_back(1);
        objInt2.push_back(2);
        objInt2.push_back(3);
        vector<double>::iterator oi2;
        oi2 = objInt2.begin();
Далее, у меня есть мой класс, который что-то делает ( например прибавляет число 5 к числу, на который указывает итератор).
C++
1
2
3
4
5
6
7
8
9
10
template<class Cont, class Iter = typename Cont::iterator>
class END
{
public:
    void operator()(Iter &t1, int count)
    {
            *t1 = *t1 + count;
        }
    
};
Но, я хочу, чтобы это происходило лишь тогда, когда итератор указывает на int. А когда double - там какое-то исключение.
т.е. что-то такое нужно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class END
{
public:
    void operator()(Iter &t1, int count)
    {
if(*t == int)           
{
*t1 = *t1 + count;
}
else throw Not_Int();
        }
    
};
Подскажите пожалуйста, как такое можно реализовать.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2016, 15:49
Ответы с готовыми решениями:

Тип на который указывает итератор
Как в функции узнать тип на который указывает итератор не используя auto и...

Изменить значение элемента вектора, на который указывает итератор
Собственно вопрос, возможно ли изменить значение элемента вектора, на который указывает итератор,...

Как изменить тип объекта, на который указывает указатель?
Есть абстрактный базовый класс и два производных: class Base { protected: int A; }; class...

Узнать номер элемента массива на который указывает указатель
Может вопрос глупый но тока что об этом задумался! Можно ли узнать номер элемента массива на...

как создать копию объекта, на который ссылается итератор?
Есть шаблонная фукнция, в которую передается итератор с произвольным доступом (IT). Необходимо...

10
vxg
Модератор
3299 / 2093 / 330
Регистрация: 13.01.2012
Сообщений: 8,133
26.05.2016, 16:05 2
Avgust, можно попробовать так
C++
1
if (typeid(t1) != typeid(std::vector<int>::iterator)) throw Not_Int();
но вроде бы еще можно как то расширить шаблон именно под конкретный тип
0
Avgust
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
26.05.2016, 16:24  [ТС] 3
Давайте попробую именно задачу изложить, может так понятней будет. Мне нужно осуществить битовые логические операции над какими-то операндами (например вектор). & и | работают только для типов int и сhar. Значит вот что должно быть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class Cont, class Iter = typename Cont::iterator>
class END
{
public:
    void operator()(Iter &t1, int count)
    {
        if (typeid(t1) != typeid(std::vector<int>::iterator)) throw Not_Int();
        else
        {
            *t1 = *t1 & count;
        }
    }
};
 
struct Not_Int{
    Not_Int() {}
};
main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
try{
        vector<int> objInt1;
        objInt1.push_back(5);
        objInt1.push_back(6);
        objInt1.push_back(7);
        vector<int>::iterator oi1;
        oi1 = objInt1.begin();
        cout << *oi1 << endl;
        END<vector<int>, vector<int>::iterator> logEnd1;
        logEnd1(oi1, 1);
        cout << *oi1 << endl;
    }
    catch (Not_Int)
    {
        cout << "Not Int\n";
    }
 
    try{
        vector<double> objInt2;
        objInt2.push_back(1);
        objInt2.push_back(2);
        objInt2.push_back(3);
        vector<double>::iterator oi2;
        oi2 = objInt2.begin();
        cout << *oi2 << endl;
        END<vector<double>, vector<double>::iterator> logEnd2;
        logEnd2(oi2, 1);
        cout << *oi2 << endl;
    }
    catch (Not_Int)
    {
        cout << "Not Int\n";
    }
Т.е. в первом случае всё должно работать хорошо, во втором нужно чтобы вывелась ошибка "Not Int". Но оно просто не компилируется, так как нельзя применить double к &.
0
DrOffset
10917 / 5815 / 1433
Регистрация: 30.01.2014
Сообщений: 9,357
26.05.2016, 16:27 4
Лучший ответ Сообщение было отмечено vxg как решение

Решение

Avgust,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class Cont, class Iter = typename Cont::iterator>
class END
{
public:
    void operator()(Iter &t1, int count)
    {
        operation(*t1, count);
    }
 
private:
    static void operation(int & v, int count)
    {
        v += count;
    }
    template <typename T>
    static void operation(T &, int)
    {
        throw Not_Int();
    }
};
1
26.05.2016, 16:27
vxg
Модератор
3299 / 2093 / 330
Регистрация: 13.01.2012
Сообщений: 8,133
26.05.2016, 16:30 5
Цитата Сообщение от Avgust Посмотреть сообщение
Но оно просто не компилируется, так как нельзя применить double к &
быстрый вариант - заткнуть компилятор через
C++
1
*t1 = int(*t1) & count
а вообще - что то очень адские изыски...

Добавлено через 2 минуты
во! там ^ (над моим постом) то что надо
0
rikimaru2013
2515 / 1177 / 355
Регистрация: 30.11.2013
Сообщений: 3,790
26.05.2016, 16:30 6
Avgust,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
using namespace std;
 
template<class Container, class Iter = typename Container::iterator, class Type = typename Container::value_type>
class Foo
{
public:
    void operator()( Iter &t1, int count )
    {
        cout << "not int" << endl;
    }
};
template<class Container, class Iter>
class Foo<Container, Iter, int>
{
public:
    void operator()( Iter &t1, int count )
    {
        cout << "int" << endl;
    }
};
int main()
{
    vector<double> arr1;
    vector<int> arr2;
 
    Foo<decltype(arr1)>( )( arr1.begin(), 1 );
    Foo<decltype(arr2)>( )( arr2.begin(), 1 );
}
но всёравно как странно вы кодите)
0
DrOffset
10917 / 5815 / 1433
Регистрация: 30.01.2014
Сообщений: 9,357
26.05.2016, 16:31 7
Цитата Сообщение от Avgust Посмотреть сообщение
Но оно просто не компилируется, так как нельзя применить double к &.
Все правильно. При программировании с типами - твои друзья перегрузка и специализация, про обычный if забудь в этих случаях.
1
Avgust
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
26.05.2016, 16:38  [ТС] 8
Супер, спасибо большое, всё работает, буду разбираться!)
0
DrOffset
26.05.2016, 16:39
  #9

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
но всёравно как странно вы кодите)
Чтобы ты сказал об авторе boost::spirit тогда? :)

0
rikimaru2013
26.05.2016, 17:27
  #10

Не по теме:

DrOffset, ну нельзя же ж явно Foo<decltype(arr)> оно само должно ведь) а так как он Iter принимает а не Cont - всё через попу получается)
А вот было бы foo(Cont con) .... :)

0
obivan
Падаван С++
442 / 256 / 88
Регистрация: 11.11.2014
Сообщений: 895
Завершенные тесты: 2
14.06.2016, 03:44 11
А что если попробовать помудрить со спецификацией шаблонов ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iterator>
template<class Cont, class Iter = typename Cont::iterator> class someClass {
public:
    void func(Iter& obj) {
        throw "error";
    }
};
template<class Cont> class someClass<Cont, std::iterator<std::input_iterator_tag, int>> {
public:
    void func(std::iterator<std::input_iterator_tag, int>& obj) {
        //int iterator
    }
};
Слабовато представляю как, но может все таки, но насколько понимаю во втором случае нам нужно знать тип итератора, к примеру взят из стандартной библиотеки

P.S приблизительный вариант и даже лучше уже кинули, извините не увидел
0
14.06.2016, 03:44
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2016, 03:44

Узнать указывает ли указатель
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а...

Как узнать индекс элемента массива, зная итератор на этот элемент?
Вот пример: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; size_t get_index ...

Узнать, куда указывает strstr
Здравствуйте, у меня есть массив. С помощью STRSTR я проверяю его на наличие строки, но как мне на...


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

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

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