число! = 0, слишком подвержено ошибкам.
C # сделал множество дизайнерских решений, чтобы подорвать такие распространенные ошибки, как это может привести к
Я узнал, почему. это относится к вычету аргумента шаблона.
Если вы видите класс шаблона «атомарный», у вас есть класс первичных 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)))();
}
Как указано выше, вам нужно использовать объект дважды:
(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())();
}
_processPtr
недоступен. maketh public
.
class test
{
public:
typedef void(test::*ProcessPtr)();
std::atomic<ProcessPtr> _processPtr;
void process() {};
}
с atomic
вы используете .store()
и .load()
для записи и чтения. не знаю, как это работает с указателями.