Вывод аргументов указателя на ф-цию
От: Аноним  
Дата: 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: Вывод аргументов указателя на ф-цию
От: ekamaloff Великобритания  
Дата: 07.12.05 05:04
Оценка:
Здравствуйте, Аноним, Вы писали:

У меня в 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();


ЗЫ
Можно ссылку, где у Йосаттиса горорится о таком способе инициализации?
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.