0
我有一個模板類foo(本質上是一個矩陣)。 foo的模板參數只能是int
,float
或double
,即不是const int
。原因是我有這些專門的操作符,並且複製常量情況下的操作符似乎是多餘的。我有兩個get_data
函數,它們返回一個適當的常量的指針。但我也不想row
函數選擇一行並返回const foo
,這樣調用方就不能修改返回的對象。正確指針/對象/模板參數
我的問題:
1)我如何讓B常量?
2)我是否應該爲例如foo?
2)我應該做一個reference_foo類嗎?
template <class T>
class foo
{
using uint8_t = unsigned char;
int rows = 0;
int cols = 0;
T * data = nullptr;
bool reference = false;
public:
foo() = default;
//foo(const foo&) // this is not included here for simplicity
//foo& operator=(const foo&) // this is not included here for simplicity
foo(int r, int c) : rows(r), cols(c)
{
data = new T[rows * cols];
}
~foo()
{
if (!reference)
{
delete[] data;
}
}
T * get_data()
{
return data;
}
T const * get_data() const
{
return data;
}
const foo row(int r) const
{
foo t;
t.rows = 1;
t.cols = cols;
t.reference = true;
// t.data = get_data() + r * cols; // ERROR: invalid conversion from 'const uint8_t*' to 'uint8_t*'
t.data = const_cast<T*>(get_data()) + r * cols; // Not pretty, but "ok" if the returned object is const
return t;
}
};
int main()
{
const foo<int> A(2, 1);
// A.get_data()[0] = 1; // ERROR: assignment of read-only location, perfectly catched by compiler
auto B = A.row(1);
B.get_data()[0] = 1; // B is not const... overwritten...
return 0;
}
爲簡單起見,操作員功能已被省略。
我得到這個錯誤,然後(如果我使用'常量int'作爲模板參數,並嘗試使用運算符):不匹配'operator + ='(操作數類型是'foo'和'foo ') –
Jonas
sry鏈接錯了,我會尋找更好的 – user463035818
我認爲選項#3,'const_foo',是最乾淨的選項。 –