以下代码:
#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循环。
答案 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>*))
注意事项:
编写注释时,请尽量避免偏离基准。
发表评论的目的是让问题得到解答,而不是辩论。