C ++ выполняет итерацию сразу по всем генерикам - PullRequest
0 голосов
/ 26 февраля 2019

Следующий код:

#include <cstdio>
#include <iostream>
#include <vector>

template<class type>
struct A {
    type i;
    A(type j){
        i = j;
    }
};

template<class type>
std::vector<A<type>*> ve;

int main(int argc, char** args){
    ve<int>.push_back(new A<int>(1));
    ve<int>.push_back(new A<int>(2));
    ve<char>.push_back(new A<char>('a'));
    ve<char>.push_back(new A<char>('b'));
    for(unsigned int i = 0; i < ve<int>.size(); i++)
        std::cout << ve<int>[i]->i << std::endl;
    for(unsigned int i = 0; i < ve<char>.size(); i++)
        std::cout << ve<char>[i]->i << std::endl;
    return 0;
}

выходы:

1
2
a
b


Как воспроизвести тот же вывод, но только с одним для цикла?

Да, я понимаю, что препроцессор создал здесь два разных вектора.
Покажите мне, как их объединить, или покажите мне универсальный цикл for.

1 Ответ

0 голосов
/ 26 февраля 2019

Решение:

#include <cstdio>
#include <iostream>
#include <vector>

struct B {
    virtual void memberOut(){}
};

template<class type>
struct A : B{
    type i;
    A(type j):B(){
        i = j;
    }
    void memberOut(){
        std::cout << i << std::endl;
    }
};

std::vector<B*> ve;

int main(int argc, char** args){
    ve.push_back(new A<int>(1));
    ve.push_back(new A<int>(2));
    ve.push_back(new A<char>('a'));
    ve.push_back(new A<char>('b'));
    for(unsigned int i = 0; i < ve.size(); i++)
        ve[i]->memberOut();
    return 0;
}

Примечания:
Либо сохраняйте его как два контейнера, либо выполняйте виртуальные функции.У обоих есть свои применения.
Использование шаблона для переменной просто создает две переменные.
Вы также можете сохранить другой вектор type_index и использовать typeid, чтобы запомнить, какой тип указателя указатель void позже, но это всего лишь замедлитель.версия виртуальных функций.Пример:

std::vector<void*> values
std::vector<std::type_index> types
if(types[i]==typeid(A<int>*))


Примечания:
Старайтесь не выходить за рамки при написании комментариев.
Цель комментариев - получить ответ на вопрос, а не спорить.

...