给定以下类别:
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.所做的从
bool
到void
的更改,并且这次在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/