c++ - 在 C 中使用局部变量创建类似于函数的 C++ 模板

标签 c++ c templates variables c-preprocessor

这是一个谜语。

假设我有以下 C++ 函数:

template<uint8_t MASK>
uint8_t Foo(uint8_t val)
{
    uint8_t step = 0;
    uint8_t result = 0;
    if(MASK & 0x01) {result |= (val & 0x01) >> step; ++step;}
    if(MASK & 0x02) {result |= (val & 0x02) >> step; ++step;}
    //...etc...
    if(MASK & 0x80) {result |= (val & 0x80) >> step; ++step;}

    return result;
}

当我这样实例化这个函数时(下面的所有值都只是示例值):

uint8_t someval = Foo<0xAA>(44);

编译器优化了 Foo() 中的 if 语句,因为它在编译时知道所述 if() 语句的结果是什么。

这很好,但是由于创建了局部变量 step,所以在 C 中尝试做同样的事情是有问题的。

如果 step 不存在,你可以像这样做一个大的#define:

#define Foo(MASK, val) (\
    ((MASK & 0x01) ? (val & 0x01) : 0) | \
    ((MASK & 0x02) ? (val & 0x02) : 0) | \
    ...etc...
    ((MASK & 0x80) ? (val & 0x80) : 0) | \
    )

但是对于 step,我有点陷入僵局。对于带有局部变量的 C++ 模板函数,我该怎么做才能在 C 中获得与 C++ 模板相同的功能?

请注意,使用内联 C 函数不是答案,因为编译器在编译时不知道 MASK 的值,因此所有比较都不会被优化,因此将成为最终的编译输出。

另请注意,更改#define 以包含结果值也不是答案,因为这会更改“函数”的签名。

最后,我完全意识到这个谜语可能没有答案。

最佳答案

让你的宏尝试做模板做的事;创建一个内联函数--

#define Foo(MASK, val) inline uint8_t Foo_##MASK(uint8_t val) \
{ \
   uint8_t step = 0; \
    uint8_t result = 0; \
    if(MASK & 0x01) {result |= (val & 0x01) >> step; ++step;} \
    if(MASK & 0x02) {result |= (val & 0x02) >> step; ++step;} \
    //...etc...
    if(MASK & 0x80) {result |= (val & 0x80) >> step; ++step;} \
\
    return result;\
}

关于c++ - 在 C 中使用局部变量创建类似于函数的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12012245/

相关文章:

c++ - 如何计算调用递归的次数? (计算 x^n 的乘法次数)

c++ - 插入对作为映射值

c++ - 通过迭代打开文件

c++ - 错误 : unitialized member with const type c++

c++ - dynamic_pointer_cast 的模板参数

c++ - 如何从模板中的对象 vector 上获取迭代器?

c++ - 使用 gdb 检查 boost shared_ptr

c# - 对于良好的编码实践,如果我们已经在方法 1 中验证并且方法 1 将该数据传递给方法 2,我们是否仍然需要在方法 2 中再次验证数据?

c - gcc:快速检查所有错误但不编译 C?

c - Windows、fork 和 execv