¿Es posible escribir una función de plantilla de C++ que tome un número variable de variables de entrada de diferentes tipos (el número de entrada puede limitarse a decir 10)? Por ejemplo tomar una función sql_exec()
que ejecuta una cadena de consulta SQL y guarda las filas resultantes en los vectores de enfermedades de transmisión sexual del tipo suministrado, es decirfunciones de plantillas de C++ con argumentos variables
std::vector<double> x,y;
std::vector<std::string> s;
std::string query="select * from ...";
sql_exec(query, s,x,y); // error if less than 3 rows or conversion not possible
Ahora mi enfoque ingenuo habría sido (limitado a un máximo de 2 vectores)
struct null_type {};
template <typename T1=null_type, typename T2=null_type>
void sql_query(const std::string& query_str, std::vector<T1>& col1,
std::vector<T2>& col2) {
...
}
Por supuesto que es tonto como yo no le dije a la función sobre los argumentos por defecto y nos llevamos
error: default template arguments may not be used in function templates
pero real l compila con gcc y -std=c++0x
. Sin embargo, obviamente sql_query()
todavía no toma entrada de longitud variable y necesita ser llamado con 2 vectores. Además, me gustaría tener algo portátil trabajando en la mayoría de los compiladores actuales. ¿Algo obvio que he pasado por alto? Sé que puedo cambiar el diseño y tal vez usar boost::tuple
o algo más, pero me hubiera gustado una interfaz tan simple.
como esta? http://en.wikipedia.org/wiki/C%2B%2B0x#Variadic_templates – andrewdski
Sí, gracias. Sin embargo, estoy tratando de evitar C++ 0x y también la forma recursiva de definir la función dificultaría las cosas en este caso. Dado que estoy contento con un número máximo de entradas limitadas, ¿hay alguna otra manera? – tom
es casi seguro que hay una forma de usar plantillas variadic con elegancia. Este tipo de pensamiento basado en plantillas toma un tiempo para acostumbrarse, pero es probable que sea mucho más simple que cualquier cosa que haya creado sin plantillas variadas. –