Вывод аргументов указателя на ф-цию
От:
Аноним
Дата: 06.12.05 15:49
Оценка:
Здравствуйте,
Захотелось написать примерно такой код:
test_struct
{
template < T1 >
test( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1 ) )
{
std::cout << "method returned " << GetResultString( ( obj -> *method ) () );
}
template < T1, T2 >
test( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1, T2 ) )
{
T1 temp1();
T2 temp2();
std::cout << "method returned " << GetResultString( ( obj -> *method ) ( temp1, temp2 ) );
}
}
template < class T1 >
void TestMethod( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1 ) )
{
test_struct().test( obj, method );
}
template < class T1, class T2 >
void TestMethod( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1, T2 ) )
{
test_struct().test( obj, method );
}
VC 7.1 попытался вывести аргументы, но что-то у него не заладилось... Сообщение об ошибке сейчас не скажу, но он сказал что не может покастить указатель на функцию в тип аргумента функции...
Объясните, это я в отпуск хочу, или у него какие-то проблемы?
Re: Вывод аргументов указателя на ф-цию
От:
Bell
Дата: 06.12.05 15:59
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте,
А>Захотелось написать примерно такой код:
А>А>test_struct
А>{
А>template < T1 >
А> test( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1 ) )
А> {
//Функция ждет один аргумент, в вызове нет ни одного
А> std::cout <<
"method returned " << GetResultString( ( obj -> *method ) () );
А> }
А>
template < T1, T2 >
А> test( IComInterface * obj, HRESULT (
__stdcall IComInterface ::*method )( T1, T2 ) )
А> {
А> T1 temp1();
//Старые грабли - объявление функции temp1 без аргументов с типом возвращаемого значения T
А> T2 temp2();
//Аналогично
А> std::cout <<
"method returned " << GetResultString( ( obj -> *method ) ( temp1, temp2 ) );
А> }
А>}
//Ну и зачем понадобилась test_struct?
А>
template <
class T1 >
А>
void TestMethod( IComInterface * obj, HRESULT (
__stdcall IComInterface ::*method )( T1 ) )
А>{
А> test_struct().test( obj, method );
А>}
А>
template <
class T1,
class T2 >
А>
void TestMethod( IComInterface * obj, HRESULT (
__stdcall IComInterface ::*method )( T1, T2 ) )
А>{
А> test_struct().test( obj, method );
А>}
А>
А>Объясните, это я в отпуск хочу, или у него какие-то проблемы?
Смотри коментарии в коде
Любите книгу — источник знаний (с) М.Горький
Re[2]: Вывод аргументов указателя на ф-цию
От:
Аноним
Дата: 06.12.05 16:08
Оценка:
Здравствуйте, Bell, Вы писали:
Сорри, код писался по памяти, так что...
B>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте,
А>>Захотелось написать примерно такой код:
А>>А>>test_struct
А>>{
А>>template < T1 >
А>> test( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1 ) )
А>> {
B> //Функция ждет один аргумент, в вызове нет ни одного
T1 temp(); // По Йосаттису это вроде как инициализация по умолчанию - для базовых типов - нулем. Разве нет?
// Хотя теперь в целом, понятно, откуда взялось сообщеине об ошибке
А>> std::cout <<
"method returned " << GetResultString( ( obj -> *method ) (
temp ) );
//Это конечно тут было...
А>> }
А>>
template < T1, T2 >
А>> test( IComInterface * obj, HRESULT (
__stdcall IComInterface ::*method )( T1, T2 ) )
А>> {
А>> T1 temp1();
//Старые грабли - объявление функции temp1 без аргументов с типом возвращаемого значения T
А>> T2 temp2();
//Аналогично
А>> std::cout <<
"method returned " << GetResultString( ( obj -> *method ) ( temp1, temp2 ) );
А>> }
А>>}
B>
//Ну и зачем понадобилась test_struct?
// Это выжимка из кода... структура там нужна была.
А>>
template <
class T1 >
А>>
void TestMethod( IComInterface * obj, HRESULT (
__stdcall IComInterface ::*method )( T1 ) )
А>>{
А>> test_struct().test( obj, method );
А>>}
А>>
template <
class T1,
class T2 >
А>>
void TestMethod( IComInterface * obj, HRESULT (
__stdcall IComInterface ::*method )( T1, T2 ) )
А>>{
А>> test_struct().test( obj, method );
А>>}
А>>
А>>Объясните, это я в отпуск хочу, или у него какие-то проблемы?
B>Смотри коментарии в коде
Re: Вывод аргументов указателя на ф-цию
Здравствуйте, Аноним, Вы писали:
У меня в VS2003 скомпилилось после приведения к такому виду:
struct test_struct
{
template <class T1 >
test( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1 ) )
{
T1 temp();
std::cout << "method returned " << GetResultString( ( obj -> *method ) (temp ) );
}
template <class T1, class T2 >
test( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1, T2 ) )
{
T1 temp1();
T2 temp2();
std::cout << "method returned " << GetResultString( ( obj -> *method ) ( temp1, temp2 ) );
}
};
template < class T1 >
void TestMethod( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1 ) )
{
test_struct().test( obj, method );
}
template < class T1, class T2 >
void TestMethod( IComInterface * obj, HRESULT ( __stdcall IComInterface ::*method )( T1, T2 ) )
{
test_struct().test( obj, method );
}
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[3]: Вывод аргументов указателя на ф-цию
От:
Bell
Дата: 07.12.05 07:38
Оценка:
Здравствуйте, Аноним, Вы писали:
А> T1 temp(); // [b] По Йосаттису это вроде как инициализация по умолчанию — для базовых типов — нулем. Разве нет?
Нет.
А вот так — да:
int n = int ();
ЗЫ
Можно ссылку, где у Йосаттиса горорится о таком способе инициализации?
Любите книгу — источник знаний (с) М.Горький
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить