задачка по C++ [уже решена]

Landstreicher

template <typename T> class A
{
T x;
int y;
};

template <typename T> class B {
public:
int f;
};

template <typename T> int B<T>::f { return 0; }

template <typename T> int B<A<T> >::f { return 1; }

void f
{
B<int> b1;
B<A<int> > b2;
}

Приведенный выше код не компилируется, но в целом идею показывает. Нужно сделать так, чтобы в шаблоне B некоторая функция f имела дефолтную реализацию, а если T = A<T1> — использовала некоторую специальную реализацию.
Можно менять не только B, но и A, например вводить в какие-то новые поля, typedef, enum и т.п.
Знаю одно очень извращенное решение, использующее sizeof. Хотелось бы обойтись без sizeof и как можно проще.

okunek

> template <typename T> int B<A<T> >::f { return 1; }
> а если T = A<T1> — использовала некоторую специальную реализацию
я че-то не пойму, тебе нужна полная или частичная специализация функции?

Landstreicher

Мне нужно специализировать функцию для тех случаев, когда аргументом шаблона является экземпляр другого шаблона.

okunek

так?
template <> void B<A<T1> >::f
{
}

Landstreicher

> template <> void B<A<T1> >::f
Откуда взять T1? Такой код не компилируется.

okunek

В языке не предусмотрено, чтобы можно было в шаблонном классе сразу определить частичную специализацию для конкретной функции-члена. Полную - пожалуйста, выше написал как. Можно написать частичную специализацию всего класса, но это разумно, если функций одна или мало и если дублирование кода и имеется, то им можно пренебречь. Можно по-другому сделать, правда "немножко" через задницу:

#include <iostream>
using std::cout;
using std::endl;

template <class T> class A
{
public:
T t;
};

template <class T> class B;

//здесь код для любых T кроме A< >
template <class T> struct f_func
{
int operatorB<T> &b)
{
cout << "T" << endl;
return 0;
};
};

//здесь код для A<T>
template <class T> struct f_func<A<T> >
{
int operatorB<A<T> > &b)
{
cout << "A<T>" << endl;
return 0;
}
};

template <class T> class B
{
public:
int f
{
return f_func<T>*this); //все довольны :-)
}
};

int main
{
B<int> bi;
B<A<float> > baf;
bi.f;
baf.f;
}

Landstreicher

Спасибо! Именно то, что надо.
Оставить комментарий
Имя или ник:
Комментарий: