给定以下类别:

template< class T> class table2D
{
   ...
  public:
   bool  copy(int r, int c, int rows , int cols, table2D & s ) ;
};


其中,方法copy()将s中的块或元素复制到此,

我该如何编写上述代码(使用模板??),以便可以按如下方式使用方法:

table2D  s, d ;
d.copy(0, 0, 3, 3) = s ;

最佳答案

我完全不同意tadman的评论,以至于我粗略了代码(可能有一些错误,但我认为概念是正确的)。

我敢肯定,有更优雅,更通用的方法可以对此进行编码。但是我认为这种事情很大程度上是C ++旨在发挥作用的方式。

创建占位符对象以将输入保留到某个函数的功能是一项非常标准的C ++技术,该函数的后续工作需要完成。

template< class T> class copier4i
{
    copier4i(T& t, int a, int b, int c, int d) : m_t(t), m_a(a), m_b(b), m_c(c), m_d(d) {}
    bool operator=(T& s) { return m_t.copy(m_a,m_b,m_c,m_d,s); }
    T& m_t;
    int m_a, m_b, m_c, m_d;
};

...
template< class T> class table2D
{
   ...
  public:
   bool  copy(int r, int c, int rows , int cols, table2D & s ) ;
   copier4i<table2D>  copy(int r, int c, int rows , int cols) {
      return copier4i<table2D>(*this,r,c,rows,cols); }
};


我没有一个很好的地方对此进行测试,所以我不确定我上面刚刚添加的额外<table2D>是正确的解决方案(按照我的预期推论)还是问题是否存在(我在从来没有完全清楚过在其自己的定义中使用的名称table2D,何时隐式表示table2D<T>(正如我在此所指)与何时需要显式表示(如在定义之外使用)的table2D。所以也许应该是:

   auto  copy(int r, int c, int rows , int cols) {
      return copier4i(*this,r,c,rows,cols); }


或许

   copier4i<table2D<T> >  copy(int r, int c, int rows , int cols) {
      return copier4i<table2D<T> >(*this,r,c,rows,cols); }


新版本,包括George T.所做的从boolvoid的更改,并且这次在ideone上进行了测试(作为C ++ 14代码)

#include <stdio.h>
#include <stdlib.h>


template< class T > class copier4i
{
  public:
     T&  m_t;
     int m_a, m_b, m_c, m_d;

     copier4i(T& t, int a, int b, int c, int d) : m_t(t), m_a(a), m_b(b), m_c(c), m_d(d) {}
     copier4i& operator=(T& s) { m_t.copy(m_a,m_b,m_c,m_d,s); return *this;}

} ;

template< class T> class table2D
{
   public:
     int m_rows  ;
     int m_cols  ;
     T  * m_obj  ;
   public:
     table2D( int r, int c ) {
        m_rows = r ;
        m_cols = c ;
        m_obj  = ( T * )malloc( m_rows * m_cols * sizeof( T ) ) ;
     }
     ~table2D() {
        free( m_obj );
     }
     inline T *    operator[](int  r) {
        return  (this->m_obj + (r * m_cols ) ) ;
     }
     void  copy( int r, int c, int cr, int cc, table2D &s) {
         (*this)[r][c] = s[0][0]  ;
     }

     copier4i< table2D >  copy(int r, int c, int rows , int cols)
     {
        return copier4i<table2D>( *this, r, c, rows, cols );
     }
} ;


int main()
{

  table2D<int> t(5, 5);
  table2D<int> s(5, 5);

  s.copy(0, 0, 2, 2, t );

  s.copy(0, 0, 2, 2) = t ;
}

关于c++ - LHS上的C++模板和功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33883390/

10-13 04:09