青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

c++ class template header and implementation (skeleton) definitions are often hard to read, let alone to write. Especially when defining template classes that are derived from base template classes, I often find myself struggling for the correct syntax.

In this article, I will present a template-based source code generator to produce C++ class template header implementation (skeleton) definitions in .hpp and .cpp files, based on a minimal yet functional set of methods.

A template is a way to specify generic code, with a placeholder for the type. Note that the type is the only "parameter" of a template, but a very powerful one, since anything from a function to a class (or a routine) can be specified in "general" terms without concerning yourself about the specific type. Yet. These details are postponed until you start to use the template. You can consider templates to be compile-time polymorphic, yet typesafe (in contrast to C MACROs).

Function vs. Class
When talking about C++ templates, one should realize that there are, in fact, two kinds of templates: function templates and class templates. The former are quite easy to implement, because they usually only contain the template(s) in their definition. As an example of a function template, here is a function that produces the minimum of two arguments, without specifying the actual type of the arguments:

template <typename T>
T max(const T &X, const T &Y)
{
if (X > Y)
return X;
else
return Y;
}
T is the usual template character that is used to specify the typename, which—at the time of definition—is unknown, and will be determined when you actually use the template in your source code. Here is an example:
int x = max(6, 42); // compiler determines T = int
float y = max(3.1415927, 2.20371); // compiler determines T = float
Or explicitly, as follows:
int x = max<int> (6, 42); // explicit template syntax
The C++ compiler will be able to determine—at compile time—where the calls to this function template are made, which argument types are used, and hence which "expansions" of this function template have to be generated (like a MACRO expansion) and then compiled and linked into an executable. All this is happening behind the scenes, of course, although template expansion can take a lot of compiler and linker resource (as you may find out when you start to use them more often).

Class templates are similar to function templates in that the compiler will determine at compile-time which expansions (or instantions) of the class template are needed. The fact that they are classes and not merely functions, makes the syntax a bit more difficult, however.

Pop Quiz
Even if you're an experienced C++ class template user, could you tell me from the top of your head what the syntax would be of the implementation skeleton for the copy constructor of a template class TDerived, which is derived from a template class TBase? You have 10 seconds ...

It turns out to be as follows:

template <class T> TDerived<T>::TDerived(const TDerived<T>& copy): TBase<T>(copy)
But I don't blame you if you couldn't come up with that right away. If you did know the answer, then you probably don't need to read the remainder of this article, unless you're also interested in a template-based template header/source generator. That's what I made for myself, to help me remember.

Canonical Class
But before I want to continue with class templates, let's first talk about a minimum useful class, sometimes also called a canonical class. By this I mean a class definition which is minimal (only a few key methods), but still complete and useful. This means that the class should at least contain the default constructor (without an argument), the destructor, a copy constructor, the assignment operator, the compare operator and last—optionally—the stream operator (always useful when debugging). When a class contains at least these methods, we can call it a canonical class.

Since I'm planning to produce a template header and source generator, it's important to realise what I should generate and what not. Making sure that I produce a canonical class—especially when it comes to templates, can make the difference between a nice but useless or an actual useful tool. As an example, here is the canonical class definition (header file) of a class TBase:

class TBase
{
public:
// Constructors & Destructors
TBase(void);
TBase(const TBase& copy);
virtual ~TBase(void);

// Operator overloading
TBase& operator = (const TBase& other);
int operator == (const TBase& other) const;

// Output
friend ostream& operator << (ostream& os, const TBase& other);
};

Canonical Class Template
We can modify the listing above to turn it into a canonical template class definition. Just like function templates, this means we have to use the <T> template syntax in a few places, and sometimes in more than a few. Luckily, it's not that hard, and the result can be seen in the following listing:
template <class T> class TBase
{
public:
// Constructors & Destructors
TBase(void);
TBase(const TBase<T>& copy);
virtual ~TBase(void);

// Operator overloading
TBase<T>& operator = (const TBase<T>& other);
int operator == (const TBase<T>& other) const;

// Output
friend ostream& operator << (ostream& os, const TBase<T>& other);
};

Just to let you know what the implementation looks like (the empty
skeletons, that is), take a look at the following listing:
// Constructors & Destructors
template <class T> TBase<T>::TBase(void) {}
template <class T> TBase<T>::TBase(const TBase<T>& copy) {}
template <class T> TBase<T>::~TBase(void) {}

// Operator overloading
template <class T> TBase<T>& TBase<T>::operator = (const TBase<T>& other) {}
template <class T> int TBase<T>::operator == (const TBase<T>& other) const {}

// Output
template <class T> ostream& operator << (ostream& os, const TBase<T>& other) {}

This is usually the place where I could do with a little help or support
to get the class template syntax right.

Derived Templates
If you've been able to keep up with me so far, then let's get to the final round: templates derived from other templates. Sometimes you just have to derive your own custom class template TDerived from a base template class TBase (sound familiar?). And just for your amusement (and mine), I've included the header listing for the derived canonical class template definition below:

template <class T> class TDerived: public TBase<T> { public: // Constructors & Destructors TDerived(void); TDerived(const TDerived<T>& copy); virtual ~TDerived(void); // Operator overloading TDerived<T>& operator = (const TDerived<T>& other); int operator == (const TDerived<T>& other) const; // Output friend ostream& operator << (ostream& os, const TDerived<T>& other); }; Certainly this TDerived class template definition needs a list of empty implementation skeletons, which are defined as follows (empty because they're skeletons, but they still need to be implemented by the programmer, of course). // Constructors & Destructors template <class T> TDerived<T>::TDerived(void): TBase<T>() {} template <class T> TDerived<T>::TDerived(const TDerived<T>& copy): TBase<T>(copy) {} template <class T> TDerived<T>::~TDerived(void) {} // Operator overloading template <class T> TDerived<T>& TDerived<T>::operator = (const TDerived<T>& other) {} template <class T> int TDerived<T>::operator == (const TDerived<T>& other) const {} // Output template <class T> ostream& operator << (ostream& os, const TDerived<T>& other) {} OK, who could already produce the above listing without a second thought? If you could, then you probably didn't need to read this article, because the fun stuff is over. What remains is the description of a little tool that I made for myself to actually produce and generate the output listings that we've seen so far.
Template Template
If you look closely at the listings presented so far, you can see a pattern (believe me, there is logic behind this class template syntax). In fact, I have been able to produce two template files that can be used to generate the template listings we've seen in this article. The template file for the class definition (typically inside a header file) is defined as follows:
//    File: <#class>.hpp
// Author: drs. Robert E. Swart>
// Date: <#date>
// Time: <#time>
// Version: 0.01
// Generated by: HeadGen (c) 1995-2001 by Bob Swart
(aka Dr.Bob - www.drbob42.com)
// Changes:
//

#ifndef <#class>_hpp
#define <#class>_hpp

#include <iostream.h>
<#includebase>

template <class <#templatechar>> class <#class> <#publicbase>
{
public:
// Constructors & Destructors
<#class>(void);
<#class>(const <#class><#template>& copy);
virtual ~<#class>(void);>

// Accessing functions

// Modifier functions

// Operator overloading
<#class><#template>& operator = (const <#class><#template>& other);
int operator == (const <#class><#template>& other) const;

// Streaming output
friend ostream& operator << (ostream& os, const <#class><#template>& other);

protected:
private:
};

#endif

Note the special #-tags. WebBroker developers may recognize these as
tags used in the PageProducer components. That's actually the case,
since I'm using a TPageProducer component (from the Internet tab) to
expand the above template into a true class template definition
header—with or without a template base class.
The same technique can be applied to the following template listing,
that can be used to produce the empty template skeleton implementations:
// File: <#class>.cpp
// Author: drs. Robert E. Swart
// Date: <#date>
// Time: <#time>
// Version: 0.01
// Generated by: HeadGen (c) 1995-2001 by Bob Swart
(aka Dr.Bob - www.drbob42.com)
// Changes:
//

#include "<#include>.hpp"

// Constructors & Destructors
template <class <#templatechar>> <#class><#template>::<#class>(void) <#base>
<#body>

template <class <#templatechar>> <#class><#template>::<#class>(const
<#class><#template>& copy) <#basecopy>
<#body>

template <class <#templatechar>> <#class><#template>::~<#class>(void)
<#body>

// Operator overloading
template <class <#templatechar>> <#class><#template>& <#class><#template>::operator = (const <
#class><#template>& other)
<#body>

template <class <#templatechar>> int <#class><#template>::operator == (const
<#class><#template>& other) const
<#body>

// Streaming output
template <class <#templatechar>> ostream& operator << (ostream&
os, const <#class><#template>& other)
<#body>

Again, the above listing can be used to produce a stand-alone class
template as well as a derived class template. We only need to specify
three options: the class name, the (optional) base class name, and the
template character.

HeadGen

 The utility HeadGen only requires the class name (the template character is T by default), as can be seen in Figure 1.

For the base class, specify Base in the Class Name box leave the Ancestor type box empty, and click on Generate. For the derived class, specify Derived in the Class Name box, Base in the Ancestor Type box and then click on Generate again. In both cases, the T will be added as prefix automatically (files Base.hpp and Base.cpp will contain the definition for TBase).

A very simple Borland C++Builder example program (to test the syntax of the generated files) can be seen below:

//--------------------------------------------------------- #pragma hdrstop #include "Base.cpp" // TBase #include "Derived.cpp"; // TDerived //-------------------------------------------------------- typedef TDerived<int> TintClass; #pragma argsused int main(int argc, char* argv[]) { TintClass* Bob = new TintClass(); TintClass Swart = TintClass(*Bob); if (*Bob == Swart) { *Bob = Swart; } return 0; } //-------------------------------------------------------- Note that I needed to include the .cpp files of the templates, and not only (or just) the .hpp files. That's because the .cpp files are "expanded" (like MACROs) to the compiler, which must find them in order to be able to use them. External Templates
The two template files are external files HeadGen.h (for the .hpp header) and HeadGen.c (for the .cpp source file). As an additional benefit, you can edit these templates and make sure your own copyright statements appear in them. Make sure to keep all #-tags intact, though, otherwise the template PageProducer won't be able to work correctly anymore.



from:
http://www.devx.com/cplus/Article/20689/0/page/1

posted on 2010-04-19 11:05 chatler 閱讀(643) 評論(0)  編輯 收藏 引用 所屬分類: Template
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            校园春色国产精品| 欧美一区二区女人| 一区视频在线播放| 一区二区三区欧美在线| 亚洲欧洲在线播放| 久久激情一区| 久久黄色影院| 国产精品视频999| 日韩写真视频在线观看| 亚洲日本成人网| 久久在线免费视频| 美日韩在线观看| 国产亚洲毛片| 午夜在线视频观看日韩17c| 亚洲一区二区三区精品在线观看| 欧美高清在线视频| 欧美寡妇偷汉性猛交| 在线播放一区| 久久久久久久999| 免费影视亚洲| 亚洲国产经典视频| 久热re这里精品视频在线6| 六月丁香综合| 亚洲高清久久久| 男女激情久久| 亚洲欧洲日本mm| 99精品欧美一区| 欧美日韩免费观看一区二区三区 | 亚洲人成绝费网站色www| 久久九九免费视频| 蜜乳av另类精品一区二区| 国产一区二区三区久久精品| 欧美在线一区二区| 久久视频国产精品免费视频在线| 国产又爽又黄的激情精品视频| 欧美在线观看你懂的| 久久视频这里只有精品| 亚洲成色精品| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲成人在线视频播放| 在线播放中文一区| 欧美电影在线观看完整版| 最新精品在线| 亚洲一区自拍| 国产午夜精品美女毛片视频| 久久久国产成人精品| 亚洲国产精品电影| 亚洲一区二区三区四区五区黄| 国产精品久久久久久久久借妻| 亚洲免费中文| 欧美**人妖| 亚洲一区二区免费| 国产亚洲高清视频| 欧美 日韩 国产一区二区在线视频 | 久久精品国产精品亚洲综合| 欧美高清一区| 亚洲欧美色一区| 在线观看国产精品淫| 欧美伦理a级免费电影| 午夜精品久久久久久久| 欧美激情第六页| 午夜久久tv| 91久久精品久久国产性色也91| 欧美视频中文一区二区三区在线观看| 欧美亚洲综合另类| 亚洲欧洲日产国码二区| 久久成人免费电影| 一本久道久久久| 狠狠爱综合网| 欧美视频一区二区三区四区| 久久精品视频播放| 亚洲精品乱码久久久久久黑人 | 国产精品无码专区在线观看| 毛片精品免费在线观看| 亚洲午夜高清视频| 亚洲高清免费视频| 久久精品国产91精品亚洲| 在线视频你懂得一区二区三区| 国内精品久久久久久久影视蜜臀| 欧美日韩在线电影| 欧美超级免费视 在线| 午夜亚洲一区| 亚洲视频一区| 亚洲精选在线| 亚洲国产另类久久久精品极度| 久久久蜜桃一区二区人| 午夜日韩电影| 亚洲性视频网址| 99在线精品视频在线观看| 影音先锋久久资源网| 国产嫩草影院久久久久| 国产精品第一区| 欧美色123| 欧美日韩国产不卡在线看| 免费视频久久| 六月婷婷一区| 久热成人在线视频| 久久人人超碰| 久久免费黄色| 久久精品在线视频| 久久久精品国产免费观看同学 | 在线亚洲伦理| 一区二区欧美视频| 日韩小视频在线观看| 亚洲精品久久久久久下一站 | 亚洲在线观看免费视频| 一本色道婷婷久久欧美| 日韩特黄影片| 99视频一区二区三区| 夜夜嗨一区二区| 亚洲美洲欧洲综合国产一区| 亚洲免费福利视频| 一区二区国产在线观看| 亚洲午夜黄色| 午夜老司机精品| 欧美专区在线观看一区| 久久精品伊人| 嫩草影视亚洲| 欧美日韩另类在线| 国产精品视频免费一区| 国产伦精品一区二区三区免费 | 午夜精品久久久久影视| 亚洲欧美日韩一区| 欧美在线三区| 免费日韩成人| 国产精品h在线观看| 国产精品私人影院| 狠狠狠色丁香婷婷综合久久五月| 亚洲东热激情| 一区二区三区国产精品| 亚洲专区一区| 久久这里只有精品视频首页| 亚洲国产欧美一区二区三区久久| 亚洲美女视频网| 欧美一级专区免费大片| 久久久久国内| 欧美日韩国产另类不卡| 国产欧美日韩高清| 亚洲国产欧美一区| 亚洲在线一区二区| 免费欧美日韩| 亚洲图片在线| 久久综合999| 国产精品久久久久久久久免费桃花| 国产日韩一区二区三区| 亚洲片在线观看| 久久av免费一区| 亚洲黄色毛片| 久久国产精品毛片| 欧美日韩国产精品一卡| 国内精品久久久久影院色| 在线亚洲欧美| 蜜乳av另类精品一区二区| 一本色道久久综合亚洲精品按摩| 久久岛国电影| 国产精品www994| 亚洲国产精品一区二区三区| 亚洲欧美另类在线观看| 亚洲成人在线视频网站| 欧美一级日韩一级| 欧美日韩精品国产| 亚洲国产免费| 久久米奇亚洲| 亚洲欧美日韩在线| 欧美日韩在线大尺度| 91久久精品www人人做人人爽 | 亚洲电影欧美电影有声小说| 亚洲综合社区| 欧美日韩在线视频观看| 亚洲欧洲日本国产| 另类欧美日韩国产在线| 亚洲主播在线观看| 欧美三级中文字幕在线观看| 亚洲人在线视频| 男女av一区三区二区色多| 西西裸体人体做爰大胆久久久| 欧美日韩综合网| 一本综合精品| 亚洲日本一区二区三区| 欧美aⅴ99久久黑人专区| 狠狠色综合色区| 久久久999精品免费| 亚洲欧美中文日韩在线| 国产精品女同互慰在线看| 亚洲视频第一页| 亚洲精品久久久久久久久久久久久| 免费日韩av电影| 亚洲欧美中文另类| 国产精品久久网站| 欧美成人精品三级在线观看| 欧美在线亚洲综合一区| 国产欧美日韩一区二区三区在线| 亚洲一区二区三区高清 | 亚洲精品一区二区三区蜜桃久| 久久久久在线| 在线观看国产欧美| 欧美1区2区| 欧美精品在线视频观看| 一区二区三区|亚洲午夜| 99riav1国产精品视频|