Latest web development tutorials

قالب C ++

القوالب البرمجة العامة والبرمجة العامة التي هي على نحو مستقل إلى أي نوع معين من كتابة التعليمات البرمجية.

قالب لإنشاء فئة أو وظيفة عامة أو مخطط الصيغة. حاويات المكتبة، والتكرارات، والخوارزميات على سبيل المثال، هي أمثلة على البرمجة العامة، وكلها تستخدم مفهوم القوالب.

كل حاوية لديها تعريف واحد، مثلناقلات، يمكننا تحديد عدد من أنواع مختلفة من ناقلات، مثل ناقلات <كثافة>أوناقلات <سلسلة>.

يمكنك استخدام القوالب لتحديد مهام والطبقات، دعونا نلقي نظرة على كيفية استخدامها.

قالب وظيفة

يتم تعريف الشكل العام للدالة القالب على النحو التالي:

template <class type> ret-type func-name(parameter list)
{
   // 函数的主体
}  

هنا، نوع هي وظيفة من أنواع البيانات المستخدمة أسماء نائبا. ويمكن استخدام الاسم في تعريف الدالة.

هنا مثال على قالب وظيفة بإرجاع عدد ممكن من نوعين:

#include <iostream>
#include <string>

using namespace std;

template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{
 
    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 

    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 

    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 

   return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World

قالب فئة

كما نعرف القوالب وظيفة، يمكن أن نحدد القوالب الطبقة. الشكل العام لتعريف فئة عامة كما يلي:

template <class type> class class-name {
.
.
.
}

هنا، نوع هو اسم نوع نائبا يمكن تحديد في فئة مثيل.يمكنك استخدام قائمة مفصولة بفواصل لتحديد عدة أنواع البيانات العامة.

يحدد المثال التالي فئة المكدس <>، وتطبق النهج العام لكومة عمليات البوب ​​على عناصر هي:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>

using namespace std;

template <class T>
class Stack { 
  private: 
    vector<T> elems;     // 元素 

  public: 
    void push(T const&);  // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 

template <class T>
void Stack<T>::push (T const& elem) 
{ 
    // 追加传入元素的副本
    elems.push_back(elem);    
} 

template <class T>
void Stack<T>::pop () 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::pop(): empty stack"); 
    }
	// 删除最后一个元素
    elems.pop_back();         
} 

template <class T>
T Stack<T>::top () const 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::top(): empty stack"); 
    }
	// 返回最后一个元素的副本 
    return elems.back();      
} 

int main() 
{ 
    try { 
        Stack<int>         intStack;  // int 类型的栈 
        Stack<string> stringStack;    // string 类型的栈 

        // 操作 int 类型的栈 
        intStack.push(7); 
        cout << intStack.top() <<endl; 

        // 操作 string 类型的栈 
        stringStack.push("hello"); 
        cout << stringStack.top() << std::endl; 
        stringStack.pop(); 
        stringStack.pop(); 
    } 
    catch (exception const& ex) { 
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
}  

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

7
hello
Exception: Stack<>::pop(): empty stack