2011-07-14 12 views
8
clase

El MFC CArray tiene dos parámetros de plantilla (de MSDN):En CArray de MFC, ¿cuáles son los motivos para utilizar un tipo de plantilla predeterminado diferente?

template < class TYPE, class ARG_TYPE = const TYPE& > 
class CArray 
... 

El parámetro predeterminado para ARG_TYPE es const TYPE&, y algunas preguntas sobre SO preguntar cuándo usar un tipo diferente de la predeterminada (por ejemplo Should the ARG_TYPE for a CArray be const & or not, o What's the difference between CArray and CArray ?).

Mis preguntas son ahora: ¿Hay casos de uso razonables de CArray donde ARG_TYPE no sea TYPE o const TYPE&, p. ¿otra clase? ¿Cuáles son las razones de estos usos?

+3

No fue una respuesta a su pregunta, pero ** NO ** use 'CArray'. Es una clase horrible que copiará sus elementos usando 'memcpy' en lugar de copiar la construcción. Entonces, si lo usa para contener una matriz de objetos que contienen punteros, su aplicación se bloqueará. Use 'std :: vector' en su lugar. – Praetorian

+0

Estoy buscando argumentos para no usar CArray y para convencer a mis colegas de usar std :: vector, y me pregunté sobre esta rareza. CMap es aún más horrible con 4 parámetros de plantilla y una forma complicada de determinar el orden en el mapa ... – vividos

Respuesta

2

Supongo que debería estar relacionado con la jerarquía de herencia.

struct B {}; 
struct D : B {}; 

CArray<D, const B&> myArray; 

Usted puede querer tener la base class como argumento receptora, que puede recibir una referencia const del class derivada.

1

Mi mejor ejemplo es CArray <CString, LPCTSTR>. De hecho, recuerdo que CArray <CString, CString&> no funcionó muy bien ...

Cuestiones relacionadas