Un uso sería en la programación de plantillas (meta-): por ejemplo, iterator tags se implementan como clases vacías. El único propósito aquí es pasar la información en tiempo de compilación para que pueda verificar, si un iterador pasó a, p. una función de plantilla cumple con requisitos específicos.
Ejemplo:
Esto es realmente simplificada, sólo para ge una idea. Aquí el propósito de la clase de etiqueta es para decidir, que la aplicación de un algoritmo de empleo:
class forward_iterator_tag {};
class random_access_iterator_tag {};
class MySimpleForwardIterator {
public:
typedef typename forward_iterator_tag tag;
// ...
};
class MySimpleRandomIterator {
public:
typedef typename random_access_iterator_tag tag;
// ...
};
template<class iterator, class tag>
void myfunc_int(iterator it, tag t) {
// general implementation of myfunc
}
template<class iterator>
void myfunc_int<iterator, forward_iterator_tag>(iterator it) {
// Implementation for forward iterators
}
template<class iterator>
void myfunc_int<iterator, random_access_iterator_tag>(iterator it) {
// Implementation for random access iterators
}
template<class iterator>
void myfunc(iterator it) {
myfunc_int<iterator, typename iterator::tag>(it);
}
(espero que me dieron ese derecho, que ha pasado un tiempo desde que utiliza este ...)
Con este código, puede llamar al myfunc
en un iterador arbitrario y dejar que el compilador elija la implementación correcta según el tipo de iterador (es decir, la etiqueta).
Hay un par de situaciones en las que puede ser útil; ¿Puedes dar un ejemplo para que podamos tener algún contexto? – Nate
Vacío como en ningún miembro o función; o vacío como usar el patrón Objeto nulo? – SwDevMan81
¿vio este enlace http://www.cplusplus.com/forum/general/8370/? – bjskishore123