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

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>
            欧美成人在线免费视频| 亚洲精品久久久久久久久久久久| 亚洲麻豆视频| 欧美日韩免费观看一区二区三区| 亚洲美女区一区| 亚洲国产精品久久人人爱蜜臀 | 欧美黄色片免费观看| 久久精品麻豆| 亚洲人被黑人高潮完整版| 亚洲精品国产品国语在线app| 欧美精品日韩一本| 亚洲免费婷婷| 欧美一区日本一区韩国一区| 黄色亚洲在线| 亚洲国产三级在线| 国产精品v欧美精品v日本精品动漫 | 欧美啪啪成人vr| 亚洲欧美日韩在线综合| 久久精品一区二区三区不卡| 亚洲激情在线播放| 一区二区日韩精品| 国产在线观看一区| 亚洲人永久免费| 国产日韩精品一区观看| 欧美激情 亚洲a∨综合| 欧美天堂亚洲电影院在线播放| 久久大逼视频| 欧美激情一区二区三区全黄| 亚洲摸下面视频| 免费中文日韩| 欧美怡红院视频一区二区三区| 蜜桃av一区| 久久精品国产第一区二区三区| 欧美ab在线视频| 久久国产精品99久久久久久老狼| 久久亚洲视频| 欧美一级视频| 欧美日韩国产色站一区二区三区| 久久久久久电影| 欧美视频免费| 91久久一区二区| 禁久久精品乱码| 亚洲午夜久久久| 亚洲精品五月天| 久久综合激情| 久久久久国产精品午夜一区| 欧美色道久久88综合亚洲精品| 老司机67194精品线观看| 国产精品久久久久久久久久免费| 欧美激情视频一区二区三区免费 | 久久精品99国产精品日本| 亚洲一区免费| 欧美日韩精品综合在线| 亚洲国产一区二区三区a毛片| 国内精品一区二区三区| 香港久久久电影| 99成人精品| 欧美日韩1区2区| 最新亚洲激情| 亚洲精品久久久久久下一站 | 欧美日韩亚洲系列| 亚洲经典视频在线观看| 亚洲国产精品va在线看黑人动漫| 午夜亚洲性色视频| 久久国产一区| 狠狠色综合网站久久久久久久| 亚洲一区二区在线看| 午夜精品在线视频| 国产精品日韩欧美| 欧美一级免费视频| 久久亚洲精品视频| 精品va天堂亚洲国产| 久久偷窥视频| 91久久精品美女高潮| 一本久道久久久| 欧美色视频在线| 亚洲欧美经典视频| 久久免费视频这里只有精品| 伊人精品成人久久综合软件| 美女啪啪无遮挡免费久久网站| 欧美电影在线免费观看网站| 日韩一级黄色大片| 国产精品免费一区豆花| 欧美一区二区三区视频| 欧美77777| 亚洲免费大片| 国产精品视频一二三| 欧美一区二区精品| 欧美国产成人在线| 亚洲视频日本| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 亚洲三级毛片| 欧美午夜视频在线| 亚洲一区视频在线| 男人的天堂亚洲| 亚洲视频1区| 国语自产精品视频在线看| 免费看亚洲片| 亚洲一区美女视频在线观看免费| 久久在线免费观看| 一本色道88久久加勒比精品| 国产美女精品| 欧美高清hd18日本| 先锋影音网一区二区| 亚洲第一色在线| 久久国产视频网站| av成人激情| 精品99视频| 国产精品久久久久高潮| 老司机一区二区| 亚洲男人第一av网站| 亚洲国产91| 久久久久综合| 亚洲一区欧美激情| 亚洲高清在线视频| 国产精品嫩草影院av蜜臀| 美日韩精品视频免费看| 午夜激情综合网| 日韩视频精品在线| 欧美不卡在线视频| 久久精品av麻豆的观看方式| 亚洲桃色在线一区| 亚洲乱码国产乱码精品精天堂| 国产日韩欧美中文| 国产精品久久久久久超碰| 欧美成人午夜剧场免费观看| 久久国产手机看片| 午夜精品www| 一区二区欧美在线| 亚洲乱码精品一二三四区日韩在线| 狂野欧美一区| 久久久久网址| 欧美与欧洲交xxxx免费观看| 亚洲女同同性videoxma| 99视频日韩| 日韩一区二区高清| 亚洲精品日韩欧美| 亚洲精品中文字幕女同| 在线日韩av片| 亚洲高清不卡在线| 激情五月婷婷综合| 黄色精品一区二区| 在线精品视频免费观看| 狠狠色丁香婷婷综合| 精品福利免费观看| 在线观看中文字幕亚洲| 亚洲福利精品| 亚洲第一色在线| 91久久国产综合久久91精品网站| 亚洲电影在线免费观看| 亚洲成人影音| 亚洲激情一区二区| 一本色道久久综合狠狠躁的推荐| 亚洲精品国产视频| 亚洲桃花岛网站| 欧美一区三区二区在线观看| 欧美在线观看www| 久久亚洲国产成人| 欧美电影免费| 99热这里只有精品8| 亚洲视频在线免费观看| 午夜天堂精品久久久久| 久久精品91久久久久久再现| 蜜月aⅴ免费一区二区三区| 欧美高清你懂得| 国产精品成人免费精品自在线观看| 欧美三级电影一区| 国产一区二区观看| 亚洲激情电影在线| 亚洲一级在线观看| 久久精品日韩欧美| 亚洲福利视频在线| 亚洲一区二区高清视频| 久久久福利视频| 欧美日本亚洲| 国产视频欧美| 亚洲免费观看高清完整版在线观看| 亚洲视屏一区| 久久综合中文| 99精品欧美一区| 久久成人精品无人区| 欧美日本亚洲韩国国产| 国产色视频一区| 日韩系列欧美系列| 久久久久久久91| aⅴ色国产欧美| 久久综合网络一区二区| 国产精品女人网站| 91久久夜色精品国产网站| 欧美一区二区三区免费大片| 亚洲电影自拍| 午夜亚洲激情| 欧美日韩国产系列| 在线欧美三区| 久久成人免费电影| 一区二区三区毛片| 免费观看成人www动漫视频| 国产欧美日韩在线视频| 亚洲视频你懂的| 欧美成人精品影院|