Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чем плюсы этого темплейта? 
V
    Опции темы
Alca
Дата 15.11.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



В чем плюсы этого темплейта?
Для чего он может быть предназначен?
Код

 template <typename T> inline T* getPtr(T* p)
    {
        return p;
    }



--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 15.11.2011, 15:11 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



В паре с такой перегрузкой
Код

template <typename T> inline T* getPtr(T* p)
{
    return p;
}
template <typename T> inline T* getPtr(T& p)
{
    return &p;
}

Может быть полезен для получения адреса переменной, независимо от ее типа. Т.е. если это указатель, то вернуть его самого, иначе вернуть адрес.
Функция может быть использована с шаблонным типом, когда не знаешь с чем имеешь дело, с указателем или ссылкой, но надо получить адрес объекта. В таком случае оператор &, примененный к указателю вернет адрес указателя, а функция getPtr вернет адрес объекта.
Код

template <typename T> inline T* getPtr(T* p)
{
    return p;
}

template <typename T> inline T* getPtr(T& p)
{
    return &p;
}

template <typename T> void doSomethingWithT(const T& obj)
{
    // we want to print object pointer
    std::cout << getPtr(obj) << std::endl;
}

int main ()
{
    int x = 0;
    doSomethingWithT(x);
    doSomethingWithT(&x);
}


Это сообщение отредактировал(а) azesmcar - 15.11.2011, 15:14
PM   Вверх
Alca
Дата 15.11.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Ясно

Это сообщение отредактировал(а) Alca - 15.11.2011, 16:41


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 16.11.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Еще может быть использована для явного рассмотрения чего то в качестве указателя:
Код

class A {
public:
 operator char* ();
 operator int();
};

void func(int);
void func(char*);

A a;
func(getPtr(a));
Без getPtr будет неоднозначность между приведением к char* и int

PM MAIL   Вверх
azesmcar
Дата 16.11.2011, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(xvr @  16.11.2011,  14:24 Найти цитируемый пост)
Без getPtr будет неоднозначность между приведением к char* и int

Не совсем понял о чем речь.
В данном случае неоднозначности не будет, будет ошибка компиляции. func не принимает объектов типа A*.

PM   Вверх
xvr
Дата 16.11.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(azesmcar @ 16.11.2011,  14:30)
Цитата(xvr @  16.11.2011,  14:24 Найти цитируемый пост)
Без getPtr будет неоднозначность между приведением к char* и int

Не совсем понял о чем речь.
В данном случае неоднозначности не будет, будет ошибка компиляции. func не принимает объектов типа A*.

У A есть оператор приведения типа, как к char*, так и к int. Компилятор не сможет выбрать из 2х перегруженных функций func одну
Код

class A {
public:
 operator char* ();
 operator int();
};
void func(int);
void func(char*);

void test()
{
 A a;
 func(a);
}

Цитата

> g++ -c ovr.cpp 
ovr.cpp: In function ‘void test():
ovr.cpp:12: error: call of overloaded func(A&) is ambiguous
ovr.cpp:6: note: candidates are: void func(int)
ovr.cpp:7: note:                 void func(char*)


А вот getPtr тут не поможет, увы - ему нужен явный указатель  smile 

Вот другой пример -
Код

void func(int);
void func(char*);

template <typename T> inline void* getPtr(void (*p)(T))
{
    return (void*)p;
}

void* test()
{
 return getPtr<int>(func);
}
смысл тот же - параметр getPtr используется для явного задания типа при оверлоадинге и прочих местах, где производится поиск подходящих типов

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.