#include <iostream>
enum class MemMode
{
Own,
Channel
};
template <class MgrType, void (MgrType::*method)(), MemMode memMode>
class EffectHandler
{
public:
void operator()(MgrType* instance, int& parameter, int lastNzParameter, bool compat)
{
if (memMode == MemMode::Own || !compat)
{
if (parameter)
{
parameterMemory = parameter;
}
parameter = parameterMemory;
}
else
{
parameter = lastNzParameter;
}
(instance->*method)();
}
private:
int parameterMemory = 0;
};
class GlobalEffMgr
{
private:
template <void (GlobalEffMgr::*method)(), MemMode memMode>
using GlEffHandler = EffectHandler<GlobalEffMgr, method, memMode>;
template <void (GlobalEffMgr::*method)(), MemMode memMode>
void Invoke(GlEffHandler<method, memMode>& handler)
{
handler(this, parameter, lastNzParameter, compat);
}
int lastNzParameter = 0;
int parameter = 0;
bool compat = false;
void Func1() { std::cout << "Func1: " << parameter << std::endl; }
void Func2() { std::cout << "Func2: " << parameter << std::endl; }
GlEffHandler<&GlobalEffMgr::Func1, MemMode::Own> func1Handler;
GlEffHandler<&GlobalEffMgr::Func2, MemMode::Channel> func2Handler;
public:
void Dispatch(int i, int j)
{
parameter = i;
if (i)
{
lastNzParameter = i;
}
switch (j)
{
case 1: Invoke(func1Handler); break;
case 2: Invoke(func2Handler); break;
default: break;
}
}
};
int main()
{
GlobalEffMgr mgr;
mgr.Dispatch(66, 1);
mgr.Dispatch(0, 1);
mgr.Dispatch(99, 2);
mgr.Dispatch(0, 1);
mgr.Dispatch(101, 2);
mgr.Dispatch(0, 2);
mgr.Dispatch(222, 1);
mgr.Dispatch(0, 2);
mgr.Dispatch(55, 2);
mgr.Dispatch(0, 1);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKZW51bSBjbGFzcyBNZW1Nb2RlCnsKCU93biwKCUNoYW5uZWwKfTsKCnRlbXBsYXRlIDxjbGFzcyBNZ3JUeXBlLCB2b2lkIChNZ3JUeXBlOjoqbWV0aG9kKSgpLCBNZW1Nb2RlIG1lbU1vZGU+CmNsYXNzIEVmZmVjdEhhbmRsZXIKewpwdWJsaWM6CgoJdm9pZAlvcGVyYXRvcigpKE1nclR5cGUqIGluc3RhbmNlLCBpbnQmIHBhcmFtZXRlciwgaW50IGxhc3ROelBhcmFtZXRlciwgYm9vbCBjb21wYXQpCgkJCXsKCQkJCWlmIChtZW1Nb2RlID09IE1lbU1vZGU6Ok93biB8fCAhY29tcGF0KQoJCQkJewoJCQkJCWlmIChwYXJhbWV0ZXIpCgkJCQkJewoJCQkJCQlwYXJhbWV0ZXJNZW1vcnkgPSBwYXJhbWV0ZXI7CgkJCQkJfQoJCQkJCXBhcmFtZXRlciA9IHBhcmFtZXRlck1lbW9yeTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwYXJhbWV0ZXIgPSBsYXN0TnpQYXJhbWV0ZXI7CgkJCQl9CgkJCQkoaW5zdGFuY2UtPiptZXRob2QpKCk7CgkJCX0KCnByaXZhdGU6CgkKCWludAlwYXJhbWV0ZXJNZW1vcnkgPSAwOwp9OwoKY2xhc3MgR2xvYmFsRWZmTWdyCnsKcHJpdmF0ZToKCQoJdGVtcGxhdGUgPHZvaWQgKEdsb2JhbEVmZk1ncjo6Km1ldGhvZCkoKSwgTWVtTW9kZSBtZW1Nb2RlPgoJdXNpbmcgR2xFZmZIYW5kbGVyID0gRWZmZWN0SGFuZGxlcjxHbG9iYWxFZmZNZ3IsIG1ldGhvZCwgbWVtTW9kZT47CgkKCXRlbXBsYXRlIDx2b2lkIChHbG9iYWxFZmZNZ3I6OiptZXRob2QpKCksIE1lbU1vZGUgbWVtTW9kZT4KCXZvaWQgSW52b2tlKEdsRWZmSGFuZGxlcjxtZXRob2QsIG1lbU1vZGU+JiBoYW5kbGVyKQoJCSB7CgkJCWhhbmRsZXIodGhpcywgcGFyYW1ldGVyLCBsYXN0TnpQYXJhbWV0ZXIsIGNvbXBhdCk7CgkJIH0KCQoJaW50IGxhc3ROelBhcmFtZXRlciA9IDA7CglpbnQgcGFyYW1ldGVyID0gMDsKCWJvb2wgY29tcGF0ID0gZmFsc2U7CgkKCXZvaWQgRnVuYzEoKSB7IHN0ZDo6Y291dCA8PCAiRnVuYzE6ICIgPDwgcGFyYW1ldGVyIDw8IHN0ZDo6ZW5kbDsgfQoJdm9pZCBGdW5jMigpIHsgc3RkOjpjb3V0IDw8ICJGdW5jMjogIiA8PCBwYXJhbWV0ZXIgPDwgc3RkOjplbmRsOyB9CgkKCUdsRWZmSGFuZGxlcjwmR2xvYmFsRWZmTWdyOjpGdW5jMSwgTWVtTW9kZTo6T3duPglmdW5jMUhhbmRsZXI7CglHbEVmZkhhbmRsZXI8Jkdsb2JhbEVmZk1ncjo6RnVuYzIsIE1lbU1vZGU6OkNoYW5uZWw+IGZ1bmMySGFuZGxlcjsKCQpwdWJsaWM6CQoKCXZvaWQgRGlzcGF0Y2goaW50IGksIGludCBqKQoJCSB7CgkJIAlwYXJhbWV0ZXIgPSBpOwoJCSAJaWYgKGkpCgkJIAl7CgkJIAkJbGFzdE56UGFyYW1ldGVyID0gaTsKCQkgCX0KCQkgCQoJCSAJc3dpdGNoIChqKQoJCSAJewoJCSAJCWNhc2UgMTogSW52b2tlKGZ1bmMxSGFuZGxlcik7IGJyZWFrOwoJCSAJCWNhc2UgMjogSW52b2tlKGZ1bmMySGFuZGxlcik7IGJyZWFrOwoJCSAJCWRlZmF1bHQ6IGJyZWFrOwoJCSAJfQoJCSB9Cn07CgppbnQgbWFpbigpIAp7CglHbG9iYWxFZmZNZ3IgbWdyOwoJCgltZ3IuRGlzcGF0Y2goNjYsIDEpOwoJbWdyLkRpc3BhdGNoKDAsIDEpOwoJbWdyLkRpc3BhdGNoKDk5LCAyKTsKCW1nci5EaXNwYXRjaCgwLCAxKTsKCW1nci5EaXNwYXRjaCgxMDEsIDIpOwoJbWdyLkRpc3BhdGNoKDAsIDIpOwoJbWdyLkRpc3BhdGNoKDIyMiwgMSk7CgltZ3IuRGlzcGF0Y2goMCwgMik7CgltZ3IuRGlzcGF0Y2goNTUsIDIpOwoJbWdyLkRpc3BhdGNoKDAsIDEpOwoJcmV0dXJuIDA7Cn0=