Как вызвать указатель на функцию атома

число! = 0, слишком подвержено ошибкам.

C # сделал множество дизайнерских решений, чтобы подорвать такие распространенные ошибки, как это может привести к

1
задан SubliminalBroccoli 13 July 2018 в 19:07
поделиться

3 ответа

Я узнал, почему. это относится к вычету аргумента шаблона.

Если вы видите класс шаблона «атомарный», у вас есть класс первичных T и классов, специализирующихся на T *. то я сравниваю указатель на функцию и указатель на член функции. code можно увидеть ниже:

#include <iostream>

template<typename T>
struct A
{ 
    static void Call(){std::cout << "Call T" << std::endl;}
};
template<typename T>
struct A<T*>
{ 
    static void Call(){std::cout << "Call T*" << std::endl;}
};

struct B {};

int main()
{
    A<void(B::*)()>::Call();
    A<void(*)()>::Call();
}

output:

Call T
Call T*

Предложить улучшение, использовать двойной указатель на член функции:

обновление в класс от std::atomic<ProcessPtr> _processPtr; до std::atomic<ProcessPtr*> _processPtr;

и обновление в основной функции:

int main()
{
    test t;
    test::ProcessPtr d = &test::process;
    t._processPtr = &d;
    (t.*(*(t._processPtr)))();  
}
0
ответ дан Ananta Yudica 17 August 2018 в 12:12
поделиться
  • 1
    да, это сработает, хотя еще один уровень косвенности – SubliminalBroccoli 19 July 2018 в 14:56

Как указано выше, вам нужно использовать объект дважды:

(t.*t._processPtr.load())();
 ^  ^             ^----- load() because it's an atomic variable
 |  |---- this loads the function pointer stored inside of t
 |------- actual Object to call the member function pointer on

Итак, вы закончите с этим:

int main(int argc, char** argv)
{
    test t;
    t._processPtr = &test::process;
    (t.*t._processPtr.load())();  
}
1
ответ дан Mike van Dyke 17 August 2018 в 12:12
поделиться

_processPtr недоступен. maketh public.

class test
{
public:
    typedef void(test::*ProcessPtr)();
    std::atomic<ProcessPtr> _processPtr;
    void process() {};
}

с atomic вы используете .store() и .load() для записи и чтения. не знаю, как это работает с указателями.

0
ответ дан Tim L. 17 August 2018 в 12:12
поделиться
  • 1
    это было публично .. просто забыл набрать это – SubliminalBroccoli 13 July 2018 в 19:20
Другие вопросы по тегам:

Похожие вопросы: