C ++一次遍历所有泛型

时间:2019-02-26 00:20:01

标签: c++ templates iterator containers

以下代码:

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

1 个答案:

答案 0 :(得分:0)

解决方案:

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


注意事项:
编写注释时,请尽量避免偏离基准。
发表评论的目的是让问题得到解答,而不是辩论。