быстрый вопрос:Указатель станд :: вектор станд :: вектор
Можно ли сделать указатель, который может ссылаться на std::vector<std::vector<int> >
или std::vector<std::vector<double>>
?
Thx
быстрый вопрос:Указатель станд :: вектор станд :: вектор
Можно ли сделать указатель, который может ссылаться на std::vector<std::vector<int> >
или std::vector<std::vector<double>>
?
Thx
Если вы используете boost, вы можете использовать boost:variant
. Технически это не указатель, а безопасный для одного контейнера один элемент, но он должен быть в состоянии выполнить свою работу, не прибегая к использованию «больших орудий», используя void*
.
Если вы должны вы можете использовать объединение построить
union intordouble
{
int x;
double d;
};
int main()
{
vector<intordouble> v;
return 0;
}
В основном вектор всегда союзной intordouble поэтому у вас есть указатель на него и не нужно дифференцировать. Пожалуйста, взгляните на Is it a good practice to use unions in C++?
они любые противопоказания для использования этого? –
@MatthieuRiegler см. Мое редактирование –
Вы не можете использовать этот союз, не зная, какой тип в нем находится. Если все элементы в любом векторе будут одного и того же типа, то вы можете добавить к нему дополнительный элемент данных, чтобы указать, какой тип он содержит. Если вы хотите хранить гетерогенные элементы внутри одного массива, вам нужно будет использовать (или повторно изобретать) 'boost :: variant'. –
void*
может указывать на любой из них, но перед тем, как использовать его, следует придать правильному типу.
Напечатанный указатель может указывать только на указанный тип, включая типы, которые наследуются от него. Различные специализации vector
являются разными типами и не имеют общего базового класса, поэтому ни один введенный указатель не может указывать на оба из них.
Если это действительно то, что, по вашему мнению, вам нужно сделать, вы можете изучить использование дискриминационного объединения, например boost::variant
, для хранения различных типов указателей.
<bad_guy_mode>
typedef std::vector<std::vector<int>>* vvi_ptr;
typedef std::vector<std::vector<double>>* vvd_ptr;
union int_or_double_vecs{
vvi_ptr int_vector;
vvd_ptr double_vector;
};
(Обратите внимание, что только один член доступен в то время, и это только один вы установить последний.)
</bad_guy_mode>
Что бы вы хотели делать с этим указателем? то есть в каком контексте было бы полезно иметь указатель, который может указывать на «std :: vector>» или 'std :: vector >'? –
Вы имеете в виду указатель, который может указывать на любой из них? – MikMik
Да, вот что я имел в виду! –