1

编写此代码的老板称其为默认模板参数,但我不确定它的名称。这看起来有点像偏特化,但语法更直观。它甚至是标准的 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();}
} ;
4

2 回答 2

3

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

正式地,这被称为默认模板参数。从 C++11 14.1 模板参数

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

于 2013-04-12T17:09:53.913 回答
1

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

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

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

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

实时代码示例

#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;
}
于 2013-04-12T17:27:37.430 回答