У вас есть пара проблем.
Для одной из них вам необходимо объявить шаблон перед тем, как специализироваться.
Для другой вы забыли передать экземпляр типа tupletype в :: get
Однако самое большое - это то, что вы пытаетесь частично специализировать шаблон функции, который не разрешен стандартом (поищите в SO или google, чтобы выяснить, почему).
Теперь нужно решить (несколько)то, что вы просили:
Обратите внимание, что для создания , как правило, полезной рекурсии во время компиляции, вам необходимо создать шаблон входного объекта (т. е. ваш тип кортежа) и индекс, который будет использоваться для рекурсивного использования.перебирать элементы на входе.Для рекурсии шаблона требуется частичная специализация для определения условия выхода.Вы не можете сделать это с помощью шаблонов функций, но вы можете сделать это с помощью классов - следовательно, используйте структуру.
Теперь, в специфическом смысле , вы можете достичь желаемого без использования структур.Для этого вам нужно избегать частичной специализации ... поэтому нам нужно полностью специализироваться.(До того, как за меня проголосовали - я полностью признаю, что это решение не очень полезно в общем смысле - но ОП хотел избежать структур, поэтому я и сделал!)
Сделав так, чтобы функция принимала только определенноеtupletype, мы можем иметь только один параметр шаблона - индекс.Поэтому мы можем полностью специализировать шаблон функции, чтобы получить наше условие выхода:
#include <iostream>
#include <tr1/tuple>
typedef std::tr1::tuple<int,float> tupletype;
template<size_t i>
void print(tupletype t)
{
std::cout << std::tr1::get<i>(t) << " ";
print<i-1>(t);
}
template<>
void print<0>(tupletype t)
{
std::cout << std::tr1::get<0>(t) << " ";
}
int main()
{
tupletype a(3,5);
print<1>(a);
}