Инициализировать статический член класса типа vector

У меня есть класс с частной статической переменной экземпляра типа вектор>. У меня была стратегия для инициализации этой переменной, которая включала передачу временного массива в функцию, которая не была членом класса. Это работало на старых версиях g ++, но не на g ++ 4.8.2.

Вот что я делаю:

initclass.cpp:

#include "initclass.h"
#define NINT 5

vector<pair<int,int> > initInstance(const pair<int,int> *array, int nint)
{
vector<pair<int,int> > vect;
vect.assign(array, array + nint);

return vect;
}

const vector<pair<int,int> > initclass::_intvect =
initInstance((pair<int,int>[NINT]){pair<int,int>(1,2), pair<int,int>(3,4),
pair<int,int>(5,6), pair<int,int>(7,8),
pair<int,int>(9,10)},
NINT);

initclass.h:

#ifndef INITCLASS_H_
#define INITCLASS_H_

#include <utility>
#include <vector>
using namespace std;

class initclass
{
public:
static const vector<pair<int,int> > & intvect() { return _intvect; };

private:
const static vector<pair<int,int> > _intvect;
};

#endif

Я могу сделать эту работу, просто объявив массив парных объектов перед вызовом функции initInstance, но мне интересно, есть ли лучший способ (это, конечно, упрощенный пример того, что я пытаюсь сделать: в моем реальном коде Есть много вызовов функции инициализации со многими массивами, и я бы предпочел не объявлять каждый из них перед каждым вызовом функции).

РЕДАКТИРОВАТЬ:
Я кратко подумал, что нашел решение здесь: Использование списка инициализации массива как временного в C ++ 11?

Второй ответ имеет преобразование из константного массива в (неконстантный) указатель. В моем случае это изменило бы вызов функции initInstance на:

const vector<pair<int,int> > initclass::_intvect = initInstance((pair<int,int>*)(const pair<int,int> []){pair<int,int>(1,2), pair<int,int>(3,4), pair<int,int>(5,6), pair<int,int>(7,8), pair<int,int>(9,10)}, NINT);

Это компилируется, но функция initInstance по какой-то причине никогда не вызывается.

1

Решение

Да, есть лучший способ. Вы можете удалить эту ужасную функцию, которая не делает ничего полезного. Вы можете инициализировать вектор следующим образом:

#include <iostream>
#include <vector>
#include <utility>struct A
{
const static std::vector<std::pair<int,int> > intvect;
};

const std::vector<std::pair<int,int> > A::intvect{ std::pair<int,int>(1,2), std::pair<int,int>(3,4),
std::pair<int,int>(5,6), std::pair<int,int>(7,8),
std::pair<int,int>(9,10) };

int main()
{
(void) A::intvect;
}

Это использует C ++ 11 7-й конструктор вектор — тот, который принимает список инициализатора.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]