Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > В чем плюсы этого темплейта?


Автор: Alca 15.11.2011, 15:02
В чем плюсы этого темплейта?
Для чего он может быть предназначен?
Код

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

Автор: azesmcar 15.11.2011, 15:11
В паре с такой перегрузкой
Код

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);
}

Автор: Alca 15.11.2011, 16:41
Ясно

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

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

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

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

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

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

Автор: xvr 16.11.2011, 14:54
Цитата(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 используется для явного задания типа при оверлоадинге и прочих местах, где производится поиск подходящих типов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)