Есть две несвязанные структуры A и B
template <typename T>
struct A {};
template <typename T>
struct B {};
один тип перечисления
typedef enum { ma, mb} M;
и класс C, содержащий шаблоны функций
class C
{
public:
template <typename T>
static void f1 ( A <T> &a) {}
template <typename T>
static void f2 ( B <T> &b) {}
template <typename U>
static void algo (U &u, M m)
{
/*Long algorithm here
....
*/
if ( m == ma) f1(u);
else f2(u);
}
};
Алгоритм статического метода содержит некоторый алгоритм, который довольно сложен... Он изменил некоторые значения и результаты в структуру A или B.
Я хотел бы запустить алгоритм статического метода с объектами A или B в зависимости от значения M. Но как сказать это моему компилятору :-)
int main()
{
A <double> a;
C::algo (a, ma); //Error
}
Error 1 error C2784: 'void C::f1(A<T>)' : could not deduce template argument for 'A<T>' from 'B<T>
A] Я думал об указателе на функцию, но его нельзя использовать с шаблонами функций.
B] Возможно, полиморфизм компиляции может помочь
template <typename U, M m>
static void algo (U &u, M <m> ) { ...} //Common for ma
template <typename U, M m>
static void algo (U &u, M <mb> ) { ...} //Spec. for mb
Но у этого решения есть одна большая проблема: обе реализации без необходимости должны включать почти одинаковый код (зачем писать алгоритм дважды?).
Поэтому мне нужна одна функция algo(), обрабатывающая оба типа аргументов A и B. Есть ли более удобное решение?
offering fish to Rocko's Polly
;) - person Alok Save   schedule 22.01.2012