C ++ и указатели на функции-члены - PullRequest
2 голосов
/ 15 марта 2011


Я пытаюсь отправить адрес функции-члена в мой класс "Thread", чтобы я мог активировать его оттуда.
Я прочитал, что могу использовать функторы, но хочу, чтобы он был универсальным, чтобы я мог отправить его своему конструктору "Thread", а функторам нужны шаблоны, поэтому мне этого будет недостаточно ...

Кто-нибудь знает способ сделать это?
спасибо:)

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Если я могу предложить другой подход: наследовать класс вашего потока и создать виртуальную функцию Run ().

Причина в том, что хотя можно вызвать указатель на функцию из статической функции входа в потокВы сталкиваетесь с проблемой за проблемой.Например, вы можете решить проблему наличия правильной сигнатуры функции с помощью шаблонов и переменных параметров, но это не очень полезно, потому что функция ввода не будет знать что отправить вашей функции.

С другой стороны, получить из Thread легко и просто.Вы помещаете в конструктор все, что нужно знать потоку.Или, при желании, вы можете вызвать любое количество других функций и установить любое количество членов, прежде чем создавать поток.Как только вы создадите поток, функция входа в статический поток просто вызовет виртуальную функцию Run.Теперь ... функция Run является частью объекта потока, поэтому она знает все, что знает класс - нет проблем.

Дополнительные издержки, связанные с одиночным вызовом виртуальной функции и одним указателем в vtable, такжесмехотворно маленький по сравнению с тем, как легко.

1 голос
/ 15 марта 2011

Предлагаю вам посмотреть на обработку этой темы в C ++ FAQ Lite . Короче говоря, указатели на функции-члены проблематичны, но есть несколько обходных путей, а также ряд причин, по которым их следует избегать для определенных целей.

0 голосов
/ 20 марта 2011

Наконец, я решил использовать функцию-заглушку, как было предложено в этой теме: Создать поток не принимает функцию-член
спасибо всем:)

...