科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ATL布幔下的秘密之模板技术

ATL布幔下的秘密之模板技术

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

如果你是个模板的高手,你就可以将ATL的学习作为一种享受。在这一节中,我将要尝试解释一些ATL使用的模板技术.

作者:李马编译 来源:VCKBASE 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
你也可以将用户定义的类作为一个类型参数来传递,但是请确认这个类拥有在那个模板函数或类模板中重载的所有运算符。

  例如,请看程序35那个求最大值的函数。这个程序使用了一个operator >,所以如果我们传递自己的类的话,那么这个类必须重载了>运算符。下面这个例子示范了这一点。

  程序39.

#include <iostream>
using namespace std;

template <typename T>
T Maximum(const T& a, const T& b) {
return a > b ? a : b;
}

class Point {
private:
int m_x, m_y;

public:
Point(int p_x = 0, int p_y = 0) : m_x(p_x), m_y(p_y) {
}

bool friend operator > (const Point& lhs, const Point& rhs) {
return lhs.m_x > rhs.m_x && lhs.m_y > rhs.m_y;
}

friend ostream& operator << (ostream& os, const Point& p) {
return os << "(" << p.m_x << ", " << p.m_y << ")";
}
};

int main() {
Point a(5, 10), b(15, 20);
cout << Maximum(a, b) << endl;

return 0;
}

  程序的输出为:(15, 20)

  同样,我们也能够将一个类模板作为一个模板参数传递。现在让我们来编写这样一个Point类,并将其作为一个模板参数传递给Stack类模板。

  程序40.

#include <iostream>
using namespace std;

template <typename T>
class Point {
private:
T m_x, m_y;

public:
Point(T p_x = 0, T p_y = 0) : m_x(p_x), m_y(p_y) {
}

bool friend operator > (const Point<T>& lhs, const Point<T>& rhs) {
return lhs.m_x > rhs.m_x && lhs.m_y > rhs.m_y;
}

friend ostream& operator << (ostream& os, const Point<T>& p) {
return os << "(" << p.m_x << ", " << p.m_y << ")";
}
};

template <typename T, int iSize = 10>
class Stack {
private:
T m_pData[iSize];
int m_iTop;

public:
Stack() : m_iTop(0) {
}

void Push(T p_iData) {
m_pData[m_iTop++] = p_iData;
}

T Pop() {
return m_pData[--m_iTop];
}

T Top() {
return m_pData[m_iTop];
}

private:
Stack(const Stack<T>&);
Stack<T>& operator = (const Stack<T>&);
};

int main() {
Stack<Point<int> > st;

st.Push(Point<int>(5, 10));
st.Push(Point<int>(15, 20));

cout << st.Pop() << endl;
cout << st.Pop() << endl;

return 0;
}

  程序的输出为:

(15, 20)
(5, 10)

  这个程序中最重要的部分为:Stack<Point<int> > st;

  在这里,你必须在两个大于号之间放置一个空格,否则编译器就会将它看作>>(右移运算符)并产生错误。

  对于这个程序我们还可以这么做,就是为模板参数传递默认的类型值,也就是将

template <typename T, int iSize = 10>

  换为

template <typename T = int, int iSize = 10>

  现在我们就没有必要一定在创建Stack类对象的时候传递数据类型了,但是你仍然需要书写这一对尖括弧以告知编译器使用默认的数据类型。你可以这么创建对象: Stack<> st;

  当你在类的外部定义(译注:原文此处是“declare”,我以为应该是“define”更准确一些。)类模板的成员函数的时候,你仍然需要写出带有模板参数的类模板全称。

  程序41.

#include <iostream>
using namespace std;

template <typename T>
class Point {
private:
T m_x, m_y;

public:
Point(T p_x = 0, T p_y = 0);
void Setxy(T p_x, T p_y);
T getX() const;
T getY() const;

friend ostream& operator << (ostream& os, const Point<T>& p) {
return os << "(" << p.m_x << ", " << p.m_y << ")";
}
};

template <typename T>
Point<T>::Point(T p_x, T p_y) : m_x(p_x), m_y(p_y) {
}

template <typename T>
void Point<T>::Setxy(T p_x, T p_y) {
m_x = p_x;
m_y = p_y;
}

template <typename T>
T Point<T>::getX() const {
return m_x;
}

template <typename T>
T Point<T>::getY() const {
return m_y;
}

int main() {
Point<int> p;
p.Setxy(20, 30);
cout << p << endl;

return 0;
}

  程序的输出为:(20, 30)
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章