#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T, typename R = T>
class base
{
public:
virtual R foo()
{
cout << "foo(): data type = " << typeid(T).name() << endl; return R();
}
virtual R bar()
{
cout << "bar(): return type = " << typeid(R).name() << endl; return R();
}
};
int main()
{
base<int> b;
base<int, long> b1;
b.foo(); b.bar();
b1.foo(); b1.bar();
cout << typeid(b).name() << endl;
cout << typeid(b1).name() << endl;
return 0;
}
Приведенная выше программа вернула следующее:
С g++
:
$ ./rettypetemplate
foo(): data type = i
bar(): return type = i
foo(): data type = i
bar(): return type = l
4baseIiiE
4baseIilE
С Visual Studio 2005 cl.exe
:
C:\Program Files\Microsoft Visual Studio 8\VC>rettypetemplate.exe
foo(): data type = int
bar(): return type = int
foo(): data type = int
bar(): return type = long
class base<int,int>
class base<int,long>
Хотя в этом примере показано, как это сделать, ответ, данный AProgrammer , показывает хороший способ обработки с использованием черт.Приведенный выше пример будет хорошо работать для основных типов данных, но не для пользовательских типов.Для обработки пользовательских типов, черты - путь.Чтобы узнать больше о чертах, обратитесь к книге "Шаблон C ++" от Jossutis или к " Современный дизайн C ++ ".