STL学習ノート(三)——C++98の経典言語特性


C++98の古典的な言語特性
1.非タイプテンプレートパラメータ
bitsetはbit個数を実パラメータとし、異なるタイプ間で値を付けたり比較したりすることはできません.例:
#include 

std::bitset<1> flags1;
std::bitset<2> flags2;
std::bitset<3> flags3;
flags3.set(0, true);
flags3.set(1, false);
flags3.set(2, false);
flags3[2] = true;
int size = sizeof(flags3);

2.テンプレートパラメータのデフォルト
クラステンプレートには、デフォルトの実パラメータを持つことができます.例:
template >
class Test
{
	// TODO:
}

Test test; //    Test> test;

3.キーワードtypename
typenameは、次に続くタイプを示すために使用されます.
template 
class Test
{
	typename T::SubType * ptr; // typename  SubType T     .
}
例えば、Qタイプを使用して、上記のテンプレートをインスタンス化します.
class Q
{
	typedef int SubType;
}
Test test; //       Q        SubType   .

4.メンバーテンプレート
a)クラスのメンバー関数はテンプレートであってもよいが、メンバーテンプレートは虚関数であってはならない.
b)メンバーテンプレートの特殊な形式は、オブジェクトがコピーされたときに暗黙的なタイプ変換を与えるテンプレート構築関数である.
template 
class Test
{
	template 
	Test(const Test& x);
	// ...
}
int main()
{
	Test t1;
	Test t2(t1);  //             .
	Test t3 = t1; //             .
	Test t4(t1);     //           .
	// ...
	return 0;
}

5.ネスト型クラステンプレート
template 
class Test
{
	template 
	class NestedClass
	{
		// ...
	}
}

6.基礎タイプの明確な初期化「明確な構造関数呼び出しが、実パラメータを与えない」という構文では、基礎タイプは初期値0に設定されます.
int i;          //        .
int j = int();  //            ,    0.
int k{};        //            (C++11   ),    0.
は、テンプレート関数に拡張されます.
template 
void f()
{
	T x = T(); //  x     ,      0.
	//T x{};     // C++11      ,    。
}

7.main()定義式ここでmain関数の「正しく移植性がある」定義形式は2つしかないことを強調します.
// style1.
int main()
{
	// ...
	return 0; // C++  “return 0;”      ,      (    C).
}

// style2.
int main(int argc, char * argv[])
{
	// argc        ,   1
	// argv        ,                 .
	// char * argv[]      char ** argv.
	// ...
	// return 0; // C++         .
	//              :exit()、quick_exit()、terminate().
}