CppTemplateTourial学习
偶然在知乎看到大神写的这篇cpp template的文章,觉得受益匪浅,可惜作者尚未写完,很是期待。。。 这是我看文章的过程中,顺手摘抄作者所写的代码...
文章链接:https://github.com/wuye9036/CppTemplateTutorial
#include <iostream>
using namespace std;
template <typename T>
class TypeToID
{
public:
static int const NotID = -1;
};
template <>
class TypeToID<float>
{
public:
static int const ID = 1;
};
template <typename T>
class TypeToID<T*>
{
public:
typedef T SameAsT;
static int const ID = 0x80000000;
};
void PrintID()
{
cout << "ID of float*:" << TypeToID< TypeToID<float*>::SameAsT >::ID << endl;
}
template <typename T>
class RemovePointer
{
};
template <typename T>
class RemovePointer<T*>
{
public:
typedef T Result;
};
void Foo()
{
RemovePointer<float*>::Result x = 5.0f;
std::cout << x << std::endl;
}
template <typename T>
struct X
{
};
template <typename T>
struct Y
{
typedef X<T> reboundType;
typedef typename X<T>::MemberType MemberType;
//typedef UnknownType MemberType3;
void foo()
{
X<T> instance0;
typename X<T>::MemberType instance1;
//WTF instance2;
//大王叫我来巡山 - + &
}
};
/*
// overload
void doWork( int );
void doWork(float);
void doWork(int, int);
void f ()
{
doWork(0);
doWork(0.5f);
doWork(1,1);
}
*/
template <typename T> struct DoWork; // (0) 这是原型
template <> struct DoWork<int> {} // (1) 这是int类型的"重载“"
template <> struct DoWork<float> {}; // (2) 这是float类型的重载
template <> struct DoWork<int, int> {} // (3) 这是int int类型的重载
template <typename T0, typename T1 = void> struct X
{
static void call(T0 const &p0, T1 const &p1)
{
std::cout << " X be called " << std::endl;
}
}
template <typename T0> struct X<T0>
{
static void call(T0 const &p0)
{
std::cout << "Y be called!" << std::endl;
}
}
// Boost.Tuple
template <
class T0 = null_type, class T1 = null_type, class T2 = null_type,
class T3 = null_type, class T4 = null_type, class T5 = null_type,
class T6 = null_type, class T7 = null_type, class T8 = null_type,
class T9= null_type>
class tuple;
// Tuple的一些用例
tuple<int> a;
tuple<double&,const double&, const double, double*, const double*> b;
tuple<A, int(*)(char, int), B(A::*)(C&), C> c;
tuple<std::string, std::pair<A, B> > d;
tuple<A*, tuple<const A*, const B&, C> , bool, void *> e;
// C++11 变参模板(Variadic Template) 通常只能放在最后面
template <typename... Ts> class tuple;
int main()
{
//PrintID();
Foo();
return 0;
}