我必须写一个简单的代码,接受一个char或一个整数的字符串作为输入。然后根据输入的内容制作一个std向量,如果文本是int,我就有一个int向量。唯一的问题是,我不想为每个变量类型声明一个向量,即使是空的,我想使它可扩展,所以如果有一天我想把一个结构或其他东西,我可以。
dvec::dvec( char t){
if ( t=='i')
vector<int> a;
else if( t=='f')
vector<float> a;
}
如果你想要的只是基元类型或指针,你可以做一个联合体(8个字节大小)和该联合体的向量。 这有点像C'ish,但模板是编译时的解决方案,所以对于可链接的解决方案,你需要为每个类型留出空间。 你可以为每个类型设置getter、setter、构造函数。
你可以用两种方式来实现这个东西。
1.
using element_type = std::variant<char, int, float /* ... other types */>;
using dvec = std::vector<element_type>;
这将是类型安全的,尽管缺点是矢量的每个元素都是变体,这可能不是你想要的。
2.
using dvec = std::variant<std::vector<char>,
std::vector<int>,
std::vector<float> /* ... other vector types */>;
这将给你一个变体的向量,所有的向量元素都是同质的。
这种繁琐的表达方式可以通过使用Boost.Mp11来简化。
template<class T> using vectorize_t = std::vector<T>;
template<typename ...T>
using dvec = std::variant<mp_transform<vectorize_t, T...>>;
基本上把所有的类型都放在 T...
到一个 std::vector
.
编写一个辅助函数来完成真正的工作。
template <typename T>
void do_work() {
std::vector<T> a;
// do stuff
}
// ...
if(t == 'i') {
do_work<int>();
}
else if(t == 'f') {
do_work<float>();
}
else if(t == 's') {
do_work<your_struct>();
}
根据你的具体用途,你可能需要(或至少希望)有一个叫做 do_work
只需调用多个函数,这样一来,如果需要的话,你就可以专攻。