昨晚,测试 Loki C++ 库 Typelist.h 的一些功能 -- 在BCB 6.0 环境下 。随便晒晒了:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <string>
#include <typeinfo>
#include <windows.h>

using namespace std;
#include "loki\Typelist.h"

int main(int argc,char* argv[])


{
using namespace Loki ;

// ---- test TYPELIST_N -----------------
cout << " ---- test TYPELIST_N -----" << "\n" ;
typedef TYPELIST_4(signed char, short int, int, long int)
SignedIntegrals ;
cout << " typedef TYPELIST_4(signed char, short int, int, long int)"
<< " SignedIntegrals ;" << "\n" ;

// ---- test Length<
> -----------------
cout << " ---- test Length<
> -----" << "\n" ;
cout << TL::Length<SignedIntegrals>::value << "\n" ;
cout << typeid(TL::TypeAt<SignedIntegrals ,1>::Result).name() << "\n" ;
// ---- test IndexOf -----------------
cout << TL::IndexOf<SignedIntegrals ,int>::value << "\n" ;
// ---- test Append<
> -----------------
cout << " ---- test Append<
> ----" << "\n" ;
typedef TL::Append<SignedIntegrals ,string>::Result Result ;
cout << TL::Length<Result>::value << "\n" ; //
cout << typeid(TL::TypeAt<Result ,4>::Result).name() << "\n" ;
// or : typedef TYPELIST_2(string ,String) SString ; //sString
typedef TL::Append<Result ,TYPELIST_2(string ,String) >::Result Result ;
cout << TL::Length<Result>::value << "\n" ;
//for(int i=0 ;i<TL::Length<Result>::value ;i++) //
//cout << typeid(TL::TypeAt<Result ,ConstI>::Result).name() << "\n" ;
//[C++ Error] E2396 Template argument must be a constant expression

// ---- test TypeAt<
> -----------------
cout << " ---- test TypeAt<
> ----" << "\n" ;
cout << typeid(TL::TypeAt<Result ,6>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,5>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,4>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,3>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,2>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,1>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,0>::Result).name() << "\n" ;
// ---- test Erase<
> -----------------
cout << " ---- test Erase<
> ----" << "\n" ;
cout << TL::Length<TL::Erase<Result ,double>::Result>::value << "\n" ;// no double erase none
cout << TL::Length<Result>::value << "\n" ;
typedef TL::Erase<Result ,string>::Result Result ; // erase string OK
cout << TL::Length<Result>::value << "\n" ;
typedef TL::Erase<Result ,string>::Result Result ; // erase string OK
cout << TL::Length<Result>::value << "\n" ;
typedef TL::Erase<Result ,string>::Result Result ;// no string erase none
cout << TL::Length<Result>::value << "\n" ;
// ---- test Replace<
> -----------------
cout << " ---- test Replace<
> ----" << "\n" ;
cout << TL::IndexOf<Result ,String>::value << "\n" ;// String exist -- 4
cout << TL::IndexOf<Result ,string>::value << "\n" ; // String doesn't exist -- -1
typedef TL::Replace<Result ,String ,string>::Result Result ; // Replace String to string OK
cout << TL::IndexOf<Result ,String>::value << "\n" ; // String doesn't exist -- -1
cout << TL::IndexOf<Result ,string>::value << "\n" ; // string exist -- 4
// ---- test ReplaceAll<
> -----------------
cout << " ---- test ReplaceAll<
> ----" << "\n" ;
typedef TL::Append<Result ,TYPELIST_2(string ,string) >::Result Result ;
cout << typeid(TL::TypeAt<Result ,4>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,5>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,6>::Result).name() << "\n" ;
typedef TL::ReplaceAll<Result ,string ,String >::Result Result ;
cout << typeid(TL::TypeAt<Result ,4>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,5>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,6>::Result).name() << "\n" ;
// ---- test Reverse<
> -----------------
cout << " ---- test Reverse<
> ----" << "\n" ;
using namespace Loki::TL ;
cout << Length<Result>::value << "\n" ;
cout << typeid(TL::TypeAt<Result ,0>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,1>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,2>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,3>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,4>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,5>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,6>::Result).name() << "\n" ;
typedef Reverse<Result>::Result Result ;
cout << typeid(TL::TypeAt<Result ,0>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,1>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,2>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,3>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,4>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,5>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,6>::Result).name() << "\n" ;
// ---- test NoDuplicates<
> --------------------
cout << " " << "\n" ;

// ---- test MostDerived<
> ---------------------
cout << " " << "\n" ;

// ---- test DerivedToFront<
> ------------------
cout << " " << "\n" ;

// ---- test EraseALL<
> -----------------
cout << " ---- test EraseALL<
> -----" << "\n" ;
cout << Length<Result>::value << endl ;
typedef EraseAll<Result ,String>::Result Result ;
cout << Length<Result>::value << endl ;
cout << typeid(TL::TypeAt<Result ,0>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,1>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,2>::Result).name() << "\n" ;
cout << typeid(TL::TypeAt<Result ,3>::Result).name() << "\n" ;
typedef Replace<Result ,SignedIntegrals ,NullType>::Result Result ;// no replace
cout << Length<Result>::value << endl ;
typedef EraseAll<Result ,SignedIntegrals>::Result Result ; // no erase
cout << Length<Result>::value << endl ;


/**//* ***********************************************************/
cout << "\n\n\n\n Hello ,World !" <<endl ;
system("pause");
return 0;
}


//---------------------------------------------------------------------------
继续好好学习Modern C++ Design -- C++ 设计新思维 。