2010-10-28 14 views
17

Me gustaría saber cómo se implementa tuple en la biblioteca estándar para C++ 0x. Intenté leer description in libstdc++ manual y luego leer template listing, pero es realmente difícil de entender cómo funciona, especialmente al leer el código.¿Cómo se implementa std :: tuple?

¿Puede alguien explicarme en pocas frases la idea de la implementación tuple? Quiero saber esto, porque estoy pensando en usar tuplas en mi código y quiero entender cómo funciona y qué tipo de sobrecarga trae (amplía el tiempo de compilación solamente, realiza muchas operaciones de copia en la memoria, ejecuta muchas otras funciones en el constructor , etc.)

Respuesta

23

Un enfoque para implementar tuplas es usar herencia múltiple. Los elementos de tupla están en clases de hoja, y la clase de tupla hereda de múltiples hojas. En pseudo-código:

template<typename T0, typename T1, ..., typename Tn> 
class PseudoTuple : TupleLeaf<0, T0>, TupleLeaf<1, T1>, ..., TupleLeaf<n, Tn> { 
    ... 
}; 

cada hoja tiene un índice, de manera que cada uno de la clase base se convierte en único, incluso si los tipos que contienen son idénticos, por lo que puede acceder a la enésima elemento con un simple static_cast:

static_cast<TupleLeaf<0, T0>*>(this); 
// ... 
static_cast<TupleLeaf<n, Tn>*>(this); 

he escrito una explicación detallada acerca de esta aplicación "plana" tupla aquí: C++11 tuple implementation details (Part 1)

+0

¡Sí, eso es una gran explicación! Lamentablemente, no es así como se implementa la tupla en libstdC++, que se apega a la implementación recursiva. No puedo esperar a una libC++ más ampliamente distribuida! –

+0

También podría ser útil describir brevemente la implementación no recursiva. –

+1

@KyleStrand erm, esta _es_ la implementación no recursiva (T: L1, L2, L3 frente a T: L1: L2: L3 de la implementación recursiva) – mitchnull

2

Implementando std::tuple es posible a través de variadic templates, que se introdujeron en el lenguaje de núcleo.

Sé que esto es una mera pregunta pero te da una mejor frase de búsqueda para investigar.

+2

Además, la aplicación cuenta no es trivial, como lo demuestra el hecho de que la OP mencionó intentando y no entender por rea ding el código de una implementación de ejemplo. –

+2

Esta respuesta se discutirá [en meta] (http://meta.stackoverflow.com/questions/290254/for-the-question-how-is-x-implemented-is-its-trivial-using-feature-y -an-an). – Daedalus

+1

@KyleStrand el OP leyó el código en 2010 cuando todavía no se entendían comúnmente las plantillas variadic. Le di las herramientas para entender plantillas variadas. Considero que esto es una respuesta. – Motti

10

Una tupla se implementa normalmente como una lista enlazada de tiempo de compilación.

El código es un poco ofuscado a través de plantilla-sintaxis, pero siguientes elementos normalmente están presentes:

  1. una cadena de clases con elementos de cabeza y de la cola (cons-elementos)
  2. una instancia de cola vacía para indica el final de la lista.
  3. código recursivo para recorrer la lista a un cierto índice, implementado como plantilla-instanciaciones recursivas (instanciadas en tiempo de compilación).

Existen implementaciones razonables en C++ 03 (por ejemplo, impulso).

Las plantillas variables permiten un número ilimitado de elementos, como lo menciona Motti.

El costo es normalmente un tiempo de compilación. Puede llamarse a los constructores de copia durante la inicialización (máximo 1) y al copiar las tuplas.