¿Cómo escribo una función de plantilla que opera en un contenedor arbitrario de un tipo arbitrario? Por ejemplo, ¿cómo puedo generalizar esta función ficticiaPlantilla de plantilla C++ Función
template <typename Element>
void print_size(const std::vector<Element> & a)
{
cout << a.size() << endl;
}
a
template <template<typename> class Container, typename Element>
void print_size(const Container<Element> & a)
{
cout << a.size() << endl;
}
Aquí es un uso típico
std::vector<std::string> f;
print_size(f)
Esto da error
tests/t_distances.cpp:110:12: error: no matching function for call to ‘print(std::vector<std::basic_string<char> >&)’. I'm guessing I must tell the compiler something more specific about what types that are allowed.
¿Qué es esta variante del uso de plantilla y cómo puedo solucionarlo?
¿Qué sucede si necesita obtener el tipo "contenido"? Por ejemplo, si desea crear una función que le proporcione un std :: map de dos std :: vector (uno para las claves, el otro para los valores). Pero podría usar algo más que std :: vector como una clase personalizada con iteradores begin() y end(). – ibizaman
@ibizaman Para eso son typendefs. Simplemente use 'typename Container :: value_type' (tenga en cuenta el prefijo' typename', es importante, hay otras preguntas que explican por qué). –
es este estándar value_type? Bueno, sé que está en stl para std :: vector, pero ¿es la forma reconocida de hacerlo para clases personalizadas? – ibizaman