Указатель std :: vector из std :: vector - PullRequest
0 голосов
/ 18 января 2012

быстрый вопрос:

Можно ли создать указатель, который может ссылаться на std::vector<std::vector<int> > или std::vector<std::vector<double>>?

Thx

Ответы [ 4 ]

2 голосов
/ 18 января 2012

Если вы используете опцию boost, вы можете использовать boost:variant.Технически, это не указатель, а типобезопасный контейнер из одного элемента, но он должен быть в состоянии выполнить работу, не прибегая к «большому оружию», используя void*.

2 голосов
/ 18 января 2012

Если вам нужно, вы можете использовать конструкцию объединения

union intordouble
{
    int x;
    double d;
};

int main()
{
    vector<intordouble> v;
    return 0;
}

Обычно вектор всегда имеет двойное объединение, поэтому у вас есть указатель на него, и вам не нужно различать. Пожалуйста, взгляните на Это хорошая практика для использования союзов в C ++?

1 голос
/ 18 января 2012

<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>

1 голос
/ 18 января 2012

void* может указывать на любой из них, но перед использованием должен быть приведен к правильному типу.

Типизированный указатель может указывать только на указанный тип, включая типы, наследуемые от него.Разные специализации vector являются разными типами и не имеют общего базового класса, поэтому ни один типизированный указатель не может указывать на оба из них.

Если это действительно то, что вам нужно сделать, вы могли бы изучить использование различного объединения, такого как boost::variant, для хранения различных типов указателей.

...