c++ - 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 循环。
解决方案
解决方案:
#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>*))
旁注:
写评论时尽量不要离题。
评论的目的是让问题得到回答,而不是辩论。