2013-05-01 4 views
3

У меня есть пул задач, используя потоки, которые пытаются вызвать функцию boost ::, которая оказывается чисто виртуальной, без реализации.Как определить, является ли функция boost :: чистой виртуальной?

Есть ли что-нибудь подобное?

void doStuff(boost::function<void()> foo) 
{ 
    if (!foo.pure_virtual) 
    { 
     foo(); 
    } 
} 

Примечание: Это не то же самое, как foo.empty или if (foo) { }. API .empty, похоже, не обнаруживает чистой виртуальности метода.

+3

Не могли бы вы привести конкретный пример функции «boost :: function, которая оказывается чисто виртуальной»? –

+2

Как вам удалось создать экземпляр класса, содержащего чистую виртуальную функцию? Похоже, вы вызываете 'doStuff()' откуда-то не должно быть (например, изнутри конструктора или деструктора класса в иерархии наследования). – Praetorian

+1

Чистые виртуальные точки в нулевом нет? Другое дело, что вам нужно привязать функцию к объекту, и это должно быть невозможно с чистым виртуальным –

ответ

-4

Вы не можете его обнаружить, и вы не должны иметь его там, в первую очередь!

+0

* Согласился, что это не должно происходить в первую очередь. Спасибо за пример. – bitcycle

+4

"// Это не будет делать виртуальную отправку" --- это утверждение ложно. Вы пытались запустить свой код? –

+4

@bitcycle: с вами все в порядке, но ответ строится на неправильном предположении и фактически неверен. 'boost :: bind (& Foo :: f, & foo)(); '** будет ** делать виртуальную отправку в этом случае. –