Рассмотрим следующее:
- класс B
- класс Д , который
- является производным от класса B ,
- имеет параметр шаблона T ,
- имеет переменную-член x типа T
- шаблон функции F с
- параметр шаблона S
- параметр y типа S .
- указатель p , который
- имеет тип B *
- указывает на объект o класса D с параметром шаблона T , равным, например, INT
- что функция F не может быть изменена.
- F нельзя вызывать напрямую из классов B или D
Кроме того, учтите, что указывается только указатель p и что F следует вызывать с параметром y , равным переменной-члену x объекта o (это означает, что тип S равен int ).
Как можно изменить классы B и D для достижения этой цели? Я предполагаю, что нужен какой-то механизм для получения шаблона типа T . Но я не знаю, как это сделать.
Вот соответствующий код:
Файл F.h:
#include <iostream>
//////////// Consider that the lines up to the next comment cannot be changed
template< typename S > void F( S y )
{
std::cout << y << " of some type" << std::endl;
}
template<> void F<>( int y )
{
std::cout << y << " of int type." << std::endl;
}
//////////// -----------------------------
Файл BD.h:
// F.h cannot be included here
class B { };
template<typename T> class D : public B { public: T x; };
Файл main.cpp:
#include "BD.h"
#include "F.h"
int main()
{
D<int> o;
o.x = 3;
B* p = &o;
// Obviously, the following line will not work:
// F( p->x );
// Obviously, the following will work:
F( ( (D<int>*) p)->x );
// However, consider that
// 1) only p is given and
// 2) that it is not known that p points to an object of type D<int>.
// How to modify B or D to be able to invoke the correct instantiation of F here
// , i.e. that for the type of "int"?
return 0;
}