首页 > 解决方案 > C++ 一次迭代所有泛型

问题描述

以下代码:

#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 循环?

是的,我知道预处理器在这里制作了两个不同的向量。
向我展示如何组合它们或向我展示一个通用的 for 循环。

标签: c++templatesiteratorcontainers

解决方案


解决方案:

#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>*))


旁注:
写评论时尽量不要离题。
评论的目的是让问题得到回答,而不是辩论。


推荐阅读