制作一个用户定义的变量数组

问题描述 投票:1回答:2

我必须写一个简单的代码,接受一个char或一个整数的字符串作为输入。然后根据输入的内容制作一个std向量,如果文本是int,我就有一个int向量。唯一的问题是,我不想为每个变量类型声明一个向量,即使是空的,我想使它可扩展,所以如果有一天我想把一个结构或其他东西,我可以。

dvec::dvec( char t){
if ( t=='i')
    vector<int> a;
else if( t=='f')
    vector<float> a;
}
c++ user-defined-types user-defined
2个回答
0
投票

如果你想要的只是基元类型或指针,你可以做一个联合体(8个字节大小)和该联合体的向量。 这有点像C'ish,但模板是编译时的解决方案,所以对于可链接的解决方案,你需要为每个类型留出空间。 你可以为每个类型设置getter、setter、构造函数。


0
投票

你可以用两种方式来实现这个东西。

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.


0
投票

编写一个辅助函数来完成真正的工作。

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 只需调用多个函数,这样一来,如果需要的话,你就可以专攻。

© www.soinside.com 2019 - 2024. All rights reserved.