常见模板技术

这是在C++泛型编程(GP)时常常用到的技术,在工作学习中尽可以施展自己的才华。模板--一切皆有可能。

1.隐藏参数细节

模板代码和使用代码一般是这样:

   1: template<typename T>
   2: class MyClass
   3: {
   4:     private:
   5:         T m_val;
   6:         //...
   7: };
   8:  
   9: MyClass<int> var1;
  10: MyClass<double> var2;

为了让客户端使用时减少针对尖括号,有三种办法:

1).

   1: class ReClass
   2:     : public MyClass
   3: {};

这个方法在ATL/WTL中常常见到。

2).

   1: typedef MyClass ReClass;

这个呢,就是STL中的basic_string<>和IO库的那些class常用的伎俩啦。

3).

   1: template<class DefaultClass = YourClass>
   2: class MyClass
   3: {};

STL容器里allocator就是使用的这招,不过如果模板参数只有一个(上例),使用的时候还是要带上尖括号:MyClass<>,而如果是两个参数及以上,那就很爽啦,就通函数里的默认参数规则了。

 

2.Policy策略

Modern C++ Design里讲解的十分细致,如果有更大的兴趣可以去湘西阅读。Policy是通过让具体特定行为的类作为模板参数,让莫办类在处理特定问题时使用该行为的手段。在做库的时候Policy手法实在太有用了。

   1: template<typename T>
   2: class CCompare1
   3: {
   4:     public:
   5:         static bool Compare(const T &a, const T &b) const;
   6: }
   7:  
   8: template<typename T>
   9: class CCompare2
  10: {
  11: public:
  12:     static bool Compare(const T &a, const T &b) const;
  13: }
  14:  
  15: template<typename T, class DefaultComparePolicy = Compare1 >
  16: {
  17: public:
  18:     T Min(const T &a, const T &b) const
  19:     {
  20:         if( DefaultComparePolicy::Compare(a, b) )
  21:             return a;
  22:         else
  23:             return b;
  24:     }
  25: }

其实呢,在OO世界里,策略模式就是干此等事情的。而用GP的手法,是不是更方便了呢?效率是不是高了呢?

3.静多态

在《C++ template》一书中,这可是一章的内容。模拟动多态,iushi让行为看起来是动态绑定的,但绑定工作在编译阶段。从某种程度上说,模拟动态绑定是让基类知道使用上了继承类的某些属性和方法。

   1: template<typename T>
   2: class TestBase
   3: {
   4: public:
   5:     void Test()
   6:     {
   7:         return static_cast(this)->Tell();
   8:     }
   9: };
  10:  
  11: class TheTest
  12:     : public TestBase(TheTest)
  13: {
  14: public:
  15:     void Tell()
  16:     {
  17:         cout << "TheTest::Tell()" << endl;
  18:     }
  19: };
  20:  
  21: class AnotherTest
  22:     : public TestBase(AnotherTest)
  23: {
  24: public:
  25:     void Tell()
  26:     {
  27:         cout << "AnotherTest::Tell()" << endl;
  28:     }
  29: };

 

其实呢,模板技术远不止这些皮毛功夫,如果对GP感兴趣,完全可以看看STL和BOOST,而C++的1x标准肯定会左右C++泛型技术的发展。拭目以待!

你可能感兴趣的:(编程,c,工作,String,basic,Class)