繁体   English   中英

C++ 一次迭代所有泛型

[英]C++ Iterate Over All Generics At Once

以下代码:

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

解决方案:

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


旁注:
写评论时尽量不要偏离基础。
评论的目的是回答问题,而不是辩论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM