簡體   English   中英

如何根據 C++ 中的參數初始化 class 的成員?

[英]How can I initialize members of a class based on a parameter in C++?

我想實現一個使用 N 維向量的 class(從數學的角度來看)。 我正在使用 opencv 庫中的 Vec 對象,它們的簽名如下所示: Vec<typename _Tp, int cn>其中cn是該向量中的元素數。 我必須為cn參數提供一個常量。

我希望我的 class 看起來像這樣:

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

我希望能夠以動態方式初始化dim ,即創建一個MyClass object,將其dim設置為我想要的任何數字。 如何在 C++ 中正確處理此問題?

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"; 
}

Output:

center size = 10
center type =float
points size2
first point size = 10
first point type =float
Hello World!

編譯時值不能是運行時值。

如果值的范圍足夠小,您可能會生成所有可能的值並在之后發送。

看來您只需要處理 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...
    }
}

對於更大的范圍,switch case 可能會被std::index_sequence生成的仿函數數組所取代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM