Объясните почему так работает:
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.
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]: Адрес шаблонной функции
Здравствуйте, 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.
Re[3]: Адрес шаблонной функции
От:
__LP
Дата: 01.10.05 13:57
Оценка:
Здравствуйте, _nn_, Вы писали:
__>Вопрос почему компилятор не может привести void (*)(char) к void(*)() когда функция является шаблоном ?
Comeau может.
C++ можно выучить за 21 день! ...если дни — полярные.
Re[4]: Адрес шаблонной функции
Здравствуйте, __LP, Вы писали:
__L>Здравствуйте, _nn_, Вы писали:
__>>Вопрос почему компилятор не может привести void (*)(char) к void(*)() когда функция является шаблоном ?
__L>Comeau может.
Баг VС
, надеюсь в 8 исправят.
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, изящно запоминая функции и объекты произвольных типов в универсальной структуре.
Перекуём баги на фичи!
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить