c/c++ 模板与STL小例子系列<三> traits
程序员文章站
2022-05-03 13:52:50
c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题。 从一个类型为A的指针,转化到类型为B的指针,中间需要用void 来作为中介。traits好像可以解决这种问题。 下面弄了3个小例子,可以初步感受一下。 例子1: ......
c/c++ 模板与stl小例子系列<三> traits
对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题。
从一个类型为a的指针,转化到类型为b的指针,中间需要用void*来作为中介。traits好像可以解决这种问题。
下面弄了3个小例子,可以初步感受一下。
例子1:
#include <iostream> using namespace std; template<typename t, typename u> class traits{ public: typedef t value_type1; typedef t& ref1; typedef u value_type2; typedef u& ref2; }; template<typename ta, typename ua> class a : public traits<ta, ua> { }; int main(){ a<int, double>::value_type1 a = 10; a<int, double>::ref1 b = a; cout << a << endl; cout << b << endl; a<int, double>::value_type2 a1 = 10.2; a<int, double>::ref2 b1 = a1; cout << a1 << endl; cout << b1 << endl; }
例子2:
#include <iostream> using namespace std; class test1; class test2; template<typename t> class typetb1{}; template<> class typetb1<test1>{ public: typedef char ret_type; typedef int p1_type; typedef double p2_type; }; template<> class typetb1<test2>{ public: typedef double ret_type; typedef double p1_type; typedef int p2_type; }; template<typename t> class test{ public: typename typetb1<t>::ret_type func(typename typetb1<t>::p1_t\ ype x, typename typetb1<t>::p2_type y){ return x; } }; int main(){ test<test1> t; cout << t.func(65, 6.18) << endl; test<test2> t2; cout << t2.func(6.18, 65) << endl; }
例子3:
#include <iostream> using namespace std; class a{ public: void show(){cout << "a show" << endl;} }; template<typename t> class iterator_1{ public: typedef t value_type; typedef value_type* ptn; typedef value_type& ref; }; template<typename t> class iterator_2{ public: typedef t value_type; typedef value_type* ptn; typedef value_type& ref; }; template<typename t> struct traits{}; template<typename t> struct traits<t *>{ typedef t value_type; typedef value_type* ptn; typedef value_type& ref; }; int main(){ iterator_1<int>::value_type t1 = 100; cout << t1 << endl; iterator_2<double>::value_type t2 = 1.23; cout << t2 << endl; traits<double*>::value_type t3 = 4.45; cout << t3 << endl; iterator_1<a>::ptn p; p->show(); }