【问题标题】:Reducing code duplication and replacing #define with templates减少代码重复并用模板替换#define
【发布时间】:2014-01-23 17:25:43
【问题描述】:

我有这样的代码:

#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 可以是任何类型。

【问题讨论】:

  • 没有模板不能做到这一点。如果您愿意稍微更改界面(并且 S 与 D 是同一类型),他们可以做类似的事情。

标签: c++ templates


【解决方案1】:

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

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

我想这回答了你的问题,但它仍然是一个古怪的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多