我開始寫一個類,其行爲非常像std::vector
,但有一些數學操作。主要是像向量的規範和超載重要的數學運算符(+, - 等),這將增加元素明智地減去元素。通過構圖的數學矢量課
這個課程在下面發佈,我用boost::operators
來編寫所有的數學運算符,它們都完美無缺地工作。在實現迭代器時遇到了一些問題。我試圖將迭代器編寫爲嵌套類,並使用boost::iterator
來獲取迭代器的大部分/全部功能。
這是我遇到麻煩的地方,代碼不會編譯大約2英里的模板相關錯誤輸出。如果您有興趣,我可以發帖,但是是典型的詳細提升模板錯誤。
我的問題是雙重的。
首先是構圖的最佳設計選擇?我可以用私有繼承或裝飾器模式做得更好嗎?或者,也許有人知道在圖書館實施這個想法?
其次,我在做什麼錯誤的迭代器?我感覺好像在我的boost::iterator
實現中缺少一些基本的東西,並且想要修復它而不是改變我的設計。
我沒有在大多數方法中包含實現,因爲它們不是微不足道就是不重要。
//publicly inherits important boost::operators classes
template <class T>
class Coords: boost::arithmetic<Coords<T>
,boost::arithmetic<Coords<T>, T
// ,boost::indexable<Coords<T>,int,T&
// ,boost::dereferenceable<Coords<T>, T*>
// >
>
>
{
private:
//private member
std::vector<T> x_;
public:
//public constructors
Coords(int n, T x): x_(n,x){};
Coords(int n): x_(n){};
Coords(std::vector<T> &x);
Coords(const Coords &rhs);
//iterator nested class, public inherits boost::iterator_facade
class iterator: public boost::iterator_facade<iterator, Coords<T>, std::random_access_iterator_tag>{
private:
typename std::vector<T>::iterator iter_;
friend class boost::iterator_core_access;
void increment() { iter_ = iter_++;};
void decrement() { iter_ = iter_--;};
void advance(int n){ iter_ = iter_+=n;};
void equal(iterator const &other) const{
return this->iter_ == other.iter_;
}
T& dereference() const {return *iter_;};
int distance_to(iterator const &other) const{
return this->iter_ - other.iter_;
}
public:
iterator():iter_(0){};
explicit iterator(const typename Coords<T>::iterator& it):iter_(it.iter_){};
explicit iterator(const typename std::vector<T>::iterator& it):iter_(it){};
};
//methods from std::vector I would like to 'copy'
typename Coords<T>::iterator begin(){return iterator(x_.begin());};
typename Coords<T>::iterator end(){return iterator(x_.end());};
typename Coords<T>::iterator operator[](std::size_t n);
std::size_t size(){return x.size()};
//mathematical methods
T norm() const;
T square() const;
T sum() const;
T dotProd(const Coords &rhs);
//important operator overloads
Coords operator+=(const T &rhs);
Coords operator-=(const T &rhs);
Coords operator*=(const T &rhs);
Coords operator/=(const T &rhs);
Coords operator+=(const Coords<T> &rhs);
Coords operator-=(const Coords<T> &rhs);
Coords operator*=(const Coords<T> &rhs);
Coords operator/=(const Coords<T> &rhs);
};
我假設你正在建造這個班作爲個人練習。如果您想實際使用數學庫,請嘗試[Blitz ++](http://www.oonumerics.org/blitz/)。 – chrisaycock 2011-04-13 18:15:54
@chris閃電戰已經很久了。它的ublas或特徵或犰狳。 – Anycorn 2011-04-13 18:43:34
@Anycorn是的,我剛剛意識到他們已經很久沒有更新過了。萬歲uBlas! – chrisaycock 2011-04-13 18:49:39