gpt4 book ai didi

c++ - 减少代码重复并用模板替换#define

转载 作者:太空狗 更新时间:2023-10-29 23:17:00 24 4
gpt4 key购买 nike

我有这样的代码:

#define defaultOnTimer(N, X) \
if (Timers.N) Timers.N --; \
if (!Timers.N) S.X = D.X; \

defaultOnTimer(t1, sig1);
defaultOnTimer(t2, sig2);
defaultOnTimer(t3, sig3);
defaultOnTimer(t4, sig4);

虽然这可行,但我想知道是否可以使用 C++ 模板来完成相同的工作。 'defaultOnTimer' 将来可能会扩展到其他工作,所以我不想根据需要多次复制它,然后不得不查找和修改每一个。

或者这只是一项过于复杂的工作,我应该坚持使用 #define 吗?

注意 S.X 可以是任何类型。

最佳答案

它看起来很糟糕,但它以某种方式工作:

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)>();
}

但是DSTimers 应该是全局变量。您可以通过将它们作为函数参数传递来避免这种情况:

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);
}

我猜这回答了你的问题,但它仍然是一个胡思乱想的解决方案

关于c++ - 减少代码重复并用模板替换#define,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20947752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com