Как я могу инициализировать членов класса на основе параметра в C ++? - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу реализовать класс, который использует N-мерные векторы (с математической точки зрения). Я использую Ve c объекты из библиотеки opencv, и их подпись выглядит следующим образом: Vec<typename _Tp, int cn> где cn - количество элементов внутри этого вектора. Я должен предоставить константу для параметра cn.

Я хочу, чтобы мой класс выглядел примерно так:

class MyClass
{
private:
    Vec<float, dim> m_center;
    vector<Vec<float, dim>> m_points;
// ...
}

, и я хочу иметь возможность инициализировать dim динамически, то есть создайте объект MyClass, для которого dim установлен на любое число, которое я хочу. Как я могу правильно подойти к этой проблеме в C ++?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

значение времени компиляции не может быть значением времени выполнения.

Если диапазон значений достаточно мал, вы можете сгенерировать все возможные значения и отправить его позже.

Кажется, вам просто нужно обработать 1, 2 и 3, что-то вроде:

template <std::size_t dim>
class MyClass
{
public:
    void DoFullJob();
private:
    Vec<float, dim> m_center;
    vector<Vec<float, dim>> m_points;
// ...
};


int main()
{
    int i = 0;
    std::cin >> i;

    switch (i) {
        case 1: { MyClass<1>{}.DoFullJob(); break; }
        case 2: { MyClass<2>{}.DoFullJob(); break; }
        case 3: { MyClass<3>{}.DoFullJob(); break; }
        default: // Error message, or nothing...
    }
}

Для больших диапазонов регистр переключателя может быть заменен массивом функторов, сгенерированных как std::index_sequence.

0 голосов
/ 24 апреля 2020
template <typename T, int N=9>
class Vec
{
public:
    Vec()
    {
        //auto deleter = [](T* t) { delete[] t; };
        //unique_ptr <T, decltype(deleter)> test(new T[N], deleter); //customized deleter omitted
        t = new T[N];
    }
    Vec(const Vec &v)
    {
        sz = v.sz;
        t = new T[sz];
    }
    string getType()
    {
        return typeid(T).name();
    }
    int getSize()
    {
        return sz;
    }
    ~Vec()
    {
        delete [] t;
    }

private:
    T *t;
    int sz = N;
};

template<int dim = 1>
class MyClass
{
public:
    MyClass()
    {
        m_points.resize(2);
    }
    Vec<float, dim> getCenter()
    {
        return m_center;
    }

    vector<Vec<float, dim>> getPoints()
    {
        return m_points;
    }

private:
    Vec<float, dim> m_center;
    vector<Vec<float, dim>> m_points;
};

Код теста:

int main()
{
    MyClass<10> my;

    cout << "center size = " << my.getCenter().getSize() << endl;
    cout << "center type =" << my.getCenter().getType().c_str() << endl;

    cout << "points size" << my.getPoints().size() << endl;

    cout << "first point size = " << my.getPoints()[0].getSize() << endl;
    cout << "first point type =" << my.getPoints()[0].getType().c_str() << endl;

    std::cout << "Hello World!\n"; 
}

Выход:

center size = 10
center type =float
points size2
first point size = 10
first point type =float
Hello World!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...