Например, у меня есть функция шаблона, используемая для итерации вектора в векторе:Можно ли «сгруппировать» специальный шаблон?
template<class T>
void test(T t){
for(auto tt : t){
test(tt);
}
}
, который имеет пару, как частный случай, который типом пары может быть двойной, с плавающей точкой, INT, строкой ...:
pair<double,double>
pair<double,float>
pair<double,int>
pair<double,string>
pair<float,double>
pair<float,float>
pair<float,int>
pair<float,string>
pair<int,double>
pair<int,float>
pair<int,int>
pair<int,string>
pair<string,double>
pair<string,float>
pair<string,int>
pair<string,string>
шаблон может сделать какую-то работу, которая pair.first не зависит от pair.second (может быть добавить элемент в JSON, запись в файл, ... теперь использовать Printf для представления):
template<>
void test(pair<double,double> p){
printf("%f,",p.first);
printf("%f\n",p.second);
}
template<>
void test(pair<double,float> p){
printf("%f,",p.first);
printf("%f\n",p.second);
}
.
.
.
код работает, но количество шаблонной функции ужасно, потому что она нуждается 16 шаблонов, можно выделить и шаблон группы особого случая, как первые и второй, так что она нуждается 8 шаблонов только, как это:
pair<double,T>
pair<float,T>
pair<int,T>
pair<string,T>
pair<T,double>
pair<T,float>
pair<T,int>
pair<T,string>
Я стараюсь:
template<class SECOND>
void test(pair<double,SECOND> p){
printf("%f,",p.first);
test<double,SECOND>(p);
}
template<class SECOND>
void test(pair<float,SECOND> p){
printf("%f,",p.first);
test<double,SECOND>(p);
}
.
.
.
template<class FIRST>
void test(pair<FIRST,int> p){
printf("%d\n",p.second);
}
template<class FIRST>
void test(pair<FIRST,string> p){
printf("%s\n",p.second.c_str());
}
можно ли переписать шаблон следующим образом?