这个模板编程技术的名称是什么,这个标准的C ++是什么?

时间:2013-04-12 17:06:42

标签: c++ templates

我写了这段代码的老板称它为默认模板参数,但我不确定它是否是名称。这看起来有点像部分特化,但语法更直观。它甚至是标准的C ++吗?

template<class T, bool auto_delete=true> class ArrayPtr : public  Array<T*> {
public:
    ArrayPtr(){}
    ~ArrayPtr(){Done();}

    bool    Done() { 
                if (auto_delete){
                    FOR(i, Array<T*>::GetSize()) delete (*this);
                }
                return Array<T*>::Done();}
} ;

2 个答案:

答案 0 :(得分:3)

除了其他问题,使用bool auto_delete=true是标准C ++。

官方称,这称为默认模板参数。从C ++ 11 14.1模板参数

  

9 默认模板参数是在模板参数=之后指定的模板参数(14.3) 。可以为任何类型的模板参数(类型,非类型,模板)指定默认模板参数   不是模板参数包(14.5.3)。

答案 1 :(得分:1)

代码是标准的C ++;声明默认模板参数有时很有用。例如,如果您定义一个类Vector3D<T>(在数学3D矢量的意义上),将T默认为double可能是有意义的。对于标准库std::vector模板,它声明如下:

template < class T, class Alloc = allocator<T> > class vector;

注意类使用的分配器如何默认为traits类提供的特定分配器;我们大多数人通常只指定class T并让默认分配器处理基础数据结构。 C ++标准库中的大多数其他模板都使用一些默认参数进行了类似的定义。

这让我了解你所说明的具体案例。除了其他样式问题,其目的似乎适用于类型特征:类型T可以具有关联的auto_delete_trait声明如下:

Live Code Example

#include<iostream>

template<typename T>
struct auto_delete_trait {
  static const bool value = true;
};

template<typename T>
struct myclass {
  void method(T val) {
    std::cout<<"value: "<<val<<std::endl;
    if(auto_delete_trait<T>::value) {
      std::cout<<"auto_delete enabled"<<std::endl;
    } else {
      std::cout<<"auto_delete disabled"<<std::endl;
    }
  }
};

// suppose that ints are not supposed to be auto-deleted (obviously
// this is an example; the concept of "auto-delete" does not make
// sense here)
template<> 
struct auto_delete_trait<int> {
  static const bool value = false;  
};

int main() {
  myclass<double> c1;
  myclass<int> c2;
  c1.method(1.234);
  c2.method(1);

  // expected output:
  // value: 1.234
  // auto_delete enabled
  // value: 1
  // auto_delete disabled

  return 0;
}