Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Опять про шаблоны  (Прочитано 10158 раз)
0 Пользователей и 1 Гость смотрят эту тему.
stragner
Гость
« : 20-09-2004 05:28 » 

допустим написал след. шаблонную функцию
template <class Type>
void function(Type t1, Type t1) {
    /*to do*/
}

теперь в программе, если вызываю функцию надо писать
function<int>(...) или нечто в этом роде.
Так вот можно ли с помощью, например typedef, или еще чего-нить сделать так, чтоб мне эту функцию можно было вызывать нечто вроде
functionI()...
И еще, чем отличается template<class=...> от template<typename=...>
Записан
NetRaider
Гость
« Ответ #1 : 20-09-2004 08:32 » 

Цитата
допустим написал след. шаблонную функцию
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 из первого примера
« Последнее редактирование: 01-12-2007 15:40 от Алексей1153++ » Записан
Alanir Alonedaw
Гость
« Ответ #2 : 20-09-2004 08:34 » 

Цитата

Так вот можно ли с помощью, например typedef, или еще чего-нить сделать так, чтоб мне эту функцию можно было вызывать нечто вроде
functionI()...

А ты пробовал typedef'ом?
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #3 : 20-09-2004 21:48 » 

Код:
В данном случае ничем. Иногда используют соглашения, согласно которым используется 'typename' если в качестве параметра
шаблона используются примитивные(и/или POD) типы, и 'class' во всех остальных случаях.
Рекомендуется использовать typename нежели class при определении шаблонов, независимо от того что это за тип передается
(к справке: typename - новее, появился позже class)
вроде это упоминалось и в стандарте
« Последнее редактирование: 01-12-2007 15:41 от Алексей1153++ » Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #4 : 20-09-2004 23:08 » 

Сделал вырезку из стандарта
Цитата
parameterdeclaration
typeparameter:
class identifieropt
class identifieropt = typeid
typename identifieropt
typename identifieropt = typeid
template < templateparameterlist> class identifieropt
template < templateparameterlist> class identifieropt = idexpression

There is no semantic difference between class and typename in a templateparameter. typename followed by an unqualifiedid names a template type parameter. typename followed by a qualifiedname denotes the type in a nontype arameterdeclaration.
A storage class shall not be specified templateparameter declaration. Note: a template parameter may be a class template.

На счет typdef:
самый простой способ, но не самый лучший, определить макрос, что то типа
Код:
#define functionI(x,y) function<int>(x,y)  
« Последнее редактирование: 01-12-2007 15:57 от Алексей1153++ » Записан
Anonymous
Гость
« Ответ #5 : 21-09-2004 06:02 » 

Спасиб, за советы Улыбаюсь) буду писать как положено func<int>...
Записан
Serega
Гость
« Ответ #6 : 21-09-2004 06:41 » 

Так для функций компилятор сам параметризует шаблон изходя из типов параметров
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #7 : 21-09-2004 22:11 » 

Цитата: Serega
Так для функций компилятор сам параметризует шаблон изходя из типов параметров


тут много неодозночностей
если один элемент int, а другого double
а если параметры передаются с права на лево
 :?:
Записан
Serega
Гость
« Ответ #8 : 22-09-2004 06:17 » new

Если исходя из переданных параметров нельзя однозначно параметризировать шаблон компилярор об этом скажет
что значит "а если параметры передаются с права на лево" ?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines