Можно ли написать шаблонную функцию на C ++, которая принимает переменное количество входных переменных разных типов (количество входных данных может быть ограничено, скажем, 10)?
Например, возьмем функцию sql_exec ()
, которая выполняет строку запроса sql и сохраняет результирующие строки в векторах std указанного типа, то есть
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
Теперь мой наивный подход был бы (ограничен максимум 2 векторами )
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) {
...
}
Конечно, это глупо, поскольку я не сказал функции об аргументах по умолчанию, и мы получили
error: default template arguments may not be used in function templates
, но на самом деле она компилируется с помощью gcc и -std = c ++ 0x
. Однако очевидно, что sql_query ()
по-прежнему не принимает входных данных переменной длины и должен вызываться с двумя векторами. Кроме того, мне бы хотелось, чтобы что-то переносимое работало на большинстве современных компиляторов. Что-нибудь очевидное, что я пропустил? Я знаю, что могу изменить дизайн и, возможно, использовать boost :: tuple
или что-то еще, но мне бы понравился такой простой интерфейс.