爲了讓你提出確切的語法,做:
template <typename T>
class Bin
{
float minRange, maxRange;
std::vector<T> bins;
};
它應該做你放什麼在你的問題:
Bin< Bin< Bin<Obj> > > bins;
要做到這一點動態(在運行時),我採用了一些多態性。這個例子有點複雜。首先,有一個基本類型。
template <typename T>
class BinNode {
public:
virtual ~BinNode() {}
typedef std::shared_ptr< BinNode<T> > Ptr;
virtual T * is_object() { return 0; }
virtual const T * is_object() const { return 0; }
virtual Bin<T> * is_vector() { return 0; }
const T & operator = (const T &t);
BinNode<T> & operator[] (unsigned i);
};
BinNode
計算出節點是否實際上是另一個向量或對象。從BinNode
template <typename T>
class BinObj : public BinNode<T> {
T obj;
public:
T * is_object() { return &obj; }
const T * is_object() const { return &obj; }
};
BinObj
繼承,並且表示對象本身。
template <typename T>
class Bin : public BinNode<T> {
typedef typename BinNode<T>::Ptr Ptr;
typedef std::map<unsigned, std::shared_ptr<BinNode<T> > > Vec;
const unsigned dimension;
Vec vec;
public:
Bin (unsigned d) : dimension(d) {}
Bin<T> * is_vector() { return this; }
BinNode<T> & operator[] (unsigned i);
};
Bin
是BinNode
的載體中。
template <typename T>
inline const T & BinNode<T>::operator = (const T &t) {
if (!is_object()) throw 0;
return *is_object() = t;
}
如果它實際上是對象,則允許分配給BinNode
;
template <typename T>
BinNode<T> & BinNode<T>::operator[] (unsigned i) {
if (!is_vector()) throw 0;
return (*is_vector())[i];
}
允許BinNode
被索引,如果它是一個向量。
template <typename T>
inline BinNode<T> & Bin<T>::operator[] (unsigned i)
{
if (vec.find(i) != vec.end()) return *vec[i];
if (dimension > 1) vec[i] = Ptr(new Bin<T>(dimension-1));
else vec[i] = Ptr(new BinObj<T>);
return *vec[i];
}
返回索引項目,如果它存在,否則根據當前維度深度創建相應的條目。添加一個重定向操作符的漂亮印花:
template <typename T>
std::ostream &
operator << (std::ostream &os, const BinNode<T> &n) {
if (n.is_object()) return os << *(n.is_object());
return os << "node:" << &n;
}
然後你可以使用Bin
這樣的:
int dim = 3;
Bin<float> v(dim);
v[0][1][2] = 3.14;
std::cout << v[0][1][2] << std::endl;
它目前不支持0維,但我邀請您來嘗試自己做。
來源
2012-06-09 19:30:04
jxh
你是如何指定維數的?你的僞代碼在這裏是不存在的...... – ildjarn
@ildjarn:_run time_他說 –
@ K-ballo:這只是它的一部分;它傳遞給構造函數還是在構造之後提供? – ildjarn