[英]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.