看起来很糟糕,但它在某种程度上能够工作:
template<typename A, size_t N, typename B, size_t X>
void onTimer()
{
A& n = *(A*)(&Timers + N);
if (n)
{
--n;
}
if (!n)
{
*(B*)(&S + X) = *(B*)(&D + X);
}
}
这里有一个例子:
struct Timer
{
int t1, t2, t3, t4;
};
struct Sig
{
char sig1, sig2, sig3, sig4;
};
Sig S, D;
Timer Timers;
void a()
{
onTimer<int, offsetof(Timer, t1), char, offsetof(Sig, sig1)>();
}
但是,D
、S
和Timers
应该是全局变量。您可以通过将它们作为函数参数传递来避免这种情况:
template<typename A, size_t N, typename B, size_t X>
void onTimer(Timer* timer, Sig* sigS, Sig* sigD)
{
A& n = *(A*)(timer + N);
if (n)
{
--n;
}
if (!n)
{
*(B*)(sigS + X) = *(B*)(sigD + X);
}
}
void a()
{
Sig S, D;
Timer Timers;
onTimer<int, offsetof(Timer, t1), char, offsetof(Sig, sig1)>(&Timers, &S, &D);
}
我想这个回答解决了你的问题,但它仍然是一个不太理想的解决方案。