Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в шаблоне указать стандарт вызова функции? Класс-обертка для указателя функции 
:(
    Опции темы
avn
Дата 11.1.2011, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 25.10.2005

Репутация: нет
Всего: нет



Доброго времени суток!

Для работы с DLL-ками сделал класс-обертку для указателей на функцию и получил такой код:

Код

template <typename Ret, typename Arg1>
class Funct1
{
public:
    typedef Ret (*tfPtr) (Arg1);
    tfPtr fPtr;

public:
    Funct1 (tfPtr Ptr = 0): fPtr (Ptr)    {}
    Ret operator () (Arg1 A) const    { return fPtr (A);    }
};    // class Funct1

void Prn (const int A)        { printf ("%d", A); }

// **
// **  Точка входа
// **

void main (void)
{
    Funct1 <void, const int> prn (Prn);

    prn (10);
}


Все класс.

Но как только я меняю Prn на
Код

void __stdcall Prn (const int A)        { printf ("%d", A); }

все дружно падает.

Понятное дело, я могу поменять typedef в Funct1:
Код

    typedef Ret (__stdcall *tfPtr) (Arg1);

Но это не фонтан smile .

Вопрос знатокам - как указать стандарт вызова функции?

Вариант с заданием указателя на функцию как параметр для шаблона я не рассматриваю - это не позволяет мне объявить operator () (Arg1) и вызывать функцию как-будто напрямую.

Есть какие-нибудь идеи?

Конечная задача - таки оставить вызов как тут: prn (10) . Как бы исхитриться для этого?..

Добавлено через 1 минуту и 26 секунд
Да, забыл указать, что дело происходит в Microsoft Visual Studio 2008, WinXP Pro. Но, думаю, это не принципиально.
PM MAIL   Вверх
bsa
Дата 11.1.2011, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



посмотри boost::function.
Я бы на твоем месте делал как-то так:
Код
template<typename Ret, typename Arg1>
class FuncContainerBase
{
public:
   FuncContainerBase(){}
   virtual ~FuncContainerBase(){}
   virtual Ret operator()(Arg1 arg1) = 0;
private:
   //запрет копирования
   FuncContainerBase(const FuncContainerBase&);
   FuncContainerBase& operator=(const FuncContainerBase&);
};

template<typename Ret, typename Arg1, class Func>
class Function1Container : public FuncContainerBase<Ret, Arg1>
{
public:
   Function1Container(func) : ptr(func) {}
   virtual Ret operator()(Arg1 arg1) {
      return ptr(arg1);
   }
private:
   Func ptr;
};

template<typename Ret, typename Arg1>
class Function1
{
public:
   Function1() : ptr(0) {}
   template<class Func>
   Function1(Func func) : ptr(new Function1Container<Ret, Arg1, Func>(func)) {}
   ~Function1() { delete ptr; }
   Ret operator()(Arg1 arg1) {
       if (!ptr)
           throw std::runtime_error("Null function call");
       return (*ptr)(arg1);
   }
private:
   FuncContainerBase<Ret,Arg1> *ptr;
};

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.