допустим написал след. шаблонную функцию
template <class Type>
void function(Type t1, Type t1) {
/*to do*/
}
теперь в программе, если вызываю функцию надо писать
function<int>(...) или нечто в этом роде.
Так вот можно ли с помощью, например typedef, или еще чего-нить сделать так, чтоб мне эту функцию можно было вызывать нечто
вроде
functionI()...
За некоторым исключением, явно можно типы не указывать - они автоматически будут выведены компилятором исходя от фактического типа аргумента функции. В противном случае придется явно указывать тип(ы). 'typedef' к функции не применим.
Маленький пример(явное указание типов):
template<class T> struct A { typedef T B; };
template<> struct A<bool> { typedef bool B; };
template<> struct A<int> { typedef int B; };
template<class T> void f(typename A<T>::B v){}
// typedef f<int> new_f; не сработает, т.к. 'f<int>' не является типом
struct E { int a; };
int main()
{
int i;
bool b;
E s;
f<int>(i);
f<bool>(b);
f<E>(s);
//f(i); ошибка, невозможно вывести тип
//f(s); ошибка -^
// new_f(i); ошибка, см. выше
}
Но для шаблонных классов можно(код из stl):
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
typedef basic_string<wchar_t, char_traits<wchar_t>,
allocator<wchar_t> > wstring;
Помимо этого обсуждается введение в стандарт 'template typedef'
(
http://open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1406.pdf)
Внешне это выглядит так(например):
'template <typename Type1, typename Type2> typedef A<B<Type1, Type2>* > NewType;'
В настоящее время приходится делать так:
template<typename T1, typename T2>
struct NewT
{
typedef A<B<T1, T2>*> Type;
};
// и и спользовать так
NewT<T1, T2>::Type obj;
// а будет(возможно) так
NewType<T1, T2> obj;
...чем отличается template<class=...> от template<typename=...>
В данном случае ничем. Иногда используют соглашения, согласно которым используется 'typename' если в качестве параметра
шаблона используются примитивные(и/или POD) типы, и 'class' во всех остальных случаях.
Действительная необходимость использования 'typename' возникает в подобных случаях:
struct A { struct C{}; };
template<class T> void foo()
{
T::C * y; // умножение члена T::C на y
}
template<class T> void foo()
{
typename T::C * y; // определение объекта, имеющего тип T::C
}
а также в случаях, подобному определению ф-ии f из первого примера