У меня есть функция foo()
, которая принимает список типов T...
и внутри вызывает другую (шаблонную) функцию с именем do_stuff()
для каждого переданного элемента вектора. Более конкретно, мы зациклимся на векторе(длины sizeof...(T)
) и хотел бы вызвать do_stuff<Ti>()
для vector[i]
, где Ti
- это i
-й тип в T...
Информация доступна во время компиляциитак что я думаю, что это возможно, но как мы это делаем красиво?
#include <iostream>
#include <string>
#include <vector>
#include <cassert>
template <typename T>
T do_stuff(int param);
template <>
int do_stuff(int param)
{
return int(100);
}
template <>
std::string do_stuff(int param)
{
return std::string("foo");
}
template <typename... T>
void foo(const std::vector<int>& p)
{
assert(p.size() == sizeof...(T));
for (int i = 0; i < p.size(); ++i)
{
// Won't compile as T is not specified:
//do_stuff(p[i]);
// How do we choose the right T, in this case Ti from T...?
}
}
int main()
{
std::vector<int> params = { 0,1,0,5 };
foo<int, std::string, std::string, int>(params);
}