我想使用模板的遞歸來創建數組類型,如下面的代碼塊。 This is code dump on ideone。operator []爲基於模板的O(1)複雜性陣列
實際上,我無法弄清楚如何爲這種類型的數組創建O(1)複雜度的double& operator[](int)
和const double& operator[](int) const
。你有沒有任何暗示如何在不改變主要意識形態的情況下做到這一點?它甚至有可能嗎?
請幫忙。
#include <iostream>
#include <sstream>
using namespace std;
template <int N> struct Array : Array <N - 1>
{
double x;
template<int M> double& comp() { return Array<M>::x; }
template<int M> const double& comp() const { return Array<M>::x; }
//Prints vector
ostream& print(ostream& out) const
{
static_cast<const Array<N-1>*>(this)->print(out);
out << ", " <<x;
return out;
}
//Vector in place summation, without looping
Array& operator+=(const Array& v)
{
x+=v.x;
*static_cast<Array<N-1>*>(this) +=
static_cast<const Array<N-1>&>(v);
return *this;
}
};
template <> struct Array<1>
{
double x;
template<int M> double& comp() { return Array<M>::x; }
template<int M> const double& comp() const { return Array<M>::x; }
//Prints vector
ostream& print(ostream& out) const
{
out << x;
return out;
}
//Vector in place summation, without looping
Array& operator+=(const Array& v)
{
x+=v.x;
return *this;
}
};
template<int N>
ostream& operator<<(ostream& out, const Array<N>& v)
{
out << "("; v.print(out); out << ")";
return out;
}
int main()
{
Array<3> vec;
//Here I want to do something like: vec[0] = 1; vec[1] = 2; vec[3] = 3;
//instead of what you see
vec.comp<1>() = 1; vec.comp<2>() = 2; vec.comp<3>() = 3;
cout << vec << endl;
cout << (vec+=vec) << endl;
return 0;
}
UPDATE1
你怎麼看待這個thing什麼:
double& operator[] (int i) {
return reinterpret_cast<double*>(this)[i];
}
?而且,如果可以用不那麼棘手的方式來完成,我還是會徘徊。
UPDATE2
OK!在@SergV輸入之後,我決定,最好的方法是使用開關,因爲它看起來不像reinterpret_cast
那麼棘手,並且可能會給O(1)複雜性帶來些許希望。非常感謝@SergV提供了大量新信息。對我來說是新的,因爲。
UPDATE3
Why not to do your own jump table?
當它是必要的遞歸,才應使用。如果你轉儲遞歸,你可以簡單地把'double x;'改成'double x [N];'一切都會簡單得多。 –
同意。但是,如果可以在這裏執行操作符[],它仍然很有趣。我的意思是理論上的。 –
是的,它可以做到。粗略地說:'return'index == 0? x:'static_cast *>(this).operator [](index - 1);'。未經測試。 –