#include <iostream>
struct BigArrayTag {};
struct NormalPointerTag {};
struct DefaultBigArrayAllocator {};
template <class T, class Allocator>
class BigArrayTemp {
public:
typedef BigArrayTag ArrayTag;
void create(size_t size) {
std::cout << "BigArrayTemp create called with size: " << size << std::endl;
}
};
template <class Array>
struct ArrayTraits {
typedef typename Array::ArrayTag ArrayTag;
};
template <class Array>
struct ArrayTraits<Array *> {
typedef NormalPointerTag ArrayTag;
};
template <class Array>
struct ArrayTraits<const Array *> {
typedef NormalPointerTag ArrayTag;
};
template <class T>
class BigArray : public BigArrayTemp<T, DefaultBigArrayAllocator> {};
template <class Array>
void construct(Array &array) {
do_construct(array, typename ArrayTraits<Array>::ArrayTag());
}
template <class Array>
void do_construct(Array &array, BigArrayTag) {
std::cout<<"do_construct-大数组版本"<<std::endl;
}
template <class Array>
void do_construct(Array &array, NormalPointerTag) {
array = nullptr;
std::cout<<"do_construct-普通指针版本"<<std::endl;
}
#define UNUSED(x) (void)(x)
int main() {
BigArray<int> big_array;
int *normal_ptr = nullptr;
const int *const_normal_ptr = nullptr;
construct(big_array);
construct(normal_ptr);
construct(const_normal_ptr);
return 0;
}