Адрес шаблонной функции
От: _nn_ www.nemerleweb.com
Дата: 01.10.05 09:42
Оценка:
Объясните почему так работает:
template<typename T>
void x(){}

void (*p)() = reinterpret_cast<void (*)()>(&x<char>);

А так нет:
template<typename T>
void x(T){}

void (*p)() = reinterpret_cast<void (*)()>(&x<char>);


Компилятор VC 7.1.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Адрес шаблонной функции
От: IROV..  
Дата: 01.10.05 09:46
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Объясните почему так работает:

__>
__>template<typename T>
__>void x(){}

__>void (*p)() = reinterpret_cast<void (*)()>(&x<char>);
__>

__>А так нет:
__>
__>template<typename T>
__>void x(T){}

__>void (*p)() = reinterpret_cast<void (*)(char)>(&x<char>);
__>


__>Компилятор VC 7.1.
я не волшебник, я только учусь!
Re[2]: Адрес шаблонной функции
От: _nn_ www.nemerleweb.com
Дата: 01.10.05 09:59
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Здравствуйте, _nn_, Вы писали:


__>>Объясните почему так работает:

__>>
__>>template<typename T>
__>>void x(){}

__>>void (*p)() = reinterpret_cast<void (*)()>(&x<char>);
__>>

__>>А так нет:
__>>
__>>template<typename T>
__>>void x(T){}

__>>void (*p)() = reinterpret_cast<void (*)(char)>(&x<char>);
__>>

Не то

Можно сделать так:
template<typename T>
struct x_type
{
    typedef void (*type)(T);
};

void (*p)() = reinterpret_cast<void (*)()>(static_cast<x_type<char>::type>(&x<char>));

Вопрос почему компилятор не может привести void (*)(char) к void(*)() когда функция является шаблоном ?

Если нешаблонная функция то все работает как надо:
void x(char){}

void (*p)() = reinterpret_cast<void (*)()>(&x);



__>>Компилятор VC 7.1.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Адрес шаблонной функции
От: __LP  
Дата: 01.10.05 13:57
Оценка:
Здравствуйте, _nn_, Вы писали:


__>Вопрос почему компилятор не может привести void (*)(char) к void(*)() когда функция является шаблоном ?


Comeau может.
C++ можно выучить за 21 день! ...если дни — полярные.
Re[4]: Адрес шаблонной функции
От: _nn_ www.nemerleweb.com
Дата: 01.10.05 14:10
Оценка:
Здравствуйте, __LP, Вы писали:

__L>Здравствуйте, _nn_, Вы писали:



__>>Вопрос почему компилятор не может привести void (*)(char) к void(*)() когда функция является шаблоном ?


__L>Comeau может.


Баг VС , надеюсь в 8 исправят.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Адрес шаблонной функции
От: Centaur Россия  
Дата: 02.10.05 02:15
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Объясните почему так работает:

__>
__>template<typename T>
__>void x(){}

__>void (*p)() = reinterpret_cast<void (*)()>(&x<char>);
__>

__>А так нет:
__>
__>template<typename T>
__>void x(T){}

__>void (*p)() = reinterpret_cast<void (*)()>(&x<char>);
__>


Может, я чего не понимаю, но что можно сделать полезного с функцией от char, имея указатель на неё как на функцию без аргументов?
Re[2]: Адрес шаблонной функции
От: Кодт Россия  
Дата: 02.10.05 21:41
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Может, я чего не понимаю, но что можно сделать полезного с функцией от char, имея указатель на неё как на функцию без аргументов?


А что можно сделать с объектом некоего типа, имея указатель на него как void* ?

Много чего. Например, единообразно сохранить и передать её в другое место, где выполнят приведение к настоящему типу.
Этим пользуется boost::function, изящно запоминая функции и объекты произвольных типов в универсальной структуре.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.