Я пытаюсь написать алгоритм, который работает на итераторах (аналогично алгоритмам STL), однако мне нужно написать специализацию алгоритма, который будет действовать иначе, когда итераторы указывают на complex
значения по сравнению с обычными double
значениями.
Вот базовый c пример:
#include <complex>
#include <iostream>
#include <vector>
using namespace std;
template <typename InputIt>
void DoSomething(InputIt first, InputIt last)
{
cout << "Regular Double" << endl;
for (; first != last; ++first)
{
cout << *first << endl;
}
}
//// Specialize the template for containers holding complex values
//template <typename InputItToComplex>
//void DoSomething(InputItToComplex first, InputItToComplex last)
//{
// cout << "Complex Double" << endl;
//
// for (; first != last; ++first)
// {
// cout << *first << endl;
// }
//}
int main()
{
vector<double> values = { 1.5, 2.2, 3.1, 4.5, 5.1, 6.9, 7.1, 8.9 };
// Call the regular template
DoSomething(values.begin(), values.end());
vector<complex<double>> cplx_values = { complex<double>{1.4, 2.1}, complex<double>{2.2, 3.5}, complex<double>{7.1, 9.1 } };
// Need to call the complex specialized version of the template
DoSomething(cplx_values.begin(), cplx_values.end());
}
Как мне написать специализацию, чтобы она автоматически использовала специализированную версию complex
, когда у меня есть контейнер complex
ценности? Закомментированный код выше, очевидно, не будет работать, потому что он просто приведет к двум неоднозначным определениям.