gpt4 book ai didi

c++ - 如何在带有模板参数的预处理器中使用 sizeof?

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:28 27 4
gpt4 key购买 nike

我有一个如下所示的模板类。它旨在用 32 位字或 64 位字实例化。

foo.h

template <typename WORD>
class Foo
{
public:
...
void Init();
...
private:
WORD* m_ptr;
};

foo.cpp

template <typename WORD>
void Foo<WORD>::Init()
{
#if (sizeof(WORD) == 8)
// Do something
#elif (sizeof(WORD) == 4)
// Do something else
#endif
}

编译它会导致 error: missing binary operator before token "(" under GCC; and token 不是 Clang 下预处理器子表达式中的有效二元运算符

我不想提供单独的特化,因为这正是代码模板的用途。我也相信它会破坏我们使用基类指针和引用(在派生类中)所做的一些事情。

如何访问模板参数 WORD 的大小并使用它来选择代码路径?


以下将正常工作,但它会生成警告,我正试图压制。例如,它在 Coverity 下生成一个 result_independent_of_operands:

WORD unused;
if (sizeof(unused))
{
...
}

我还了解到预处理器在编译器之前运行。我对此没有误解(例如,sizeof() is not executed by preprocessor 和 friend )。

但是源代码在预处理器运行之前很久就被保存下来了,而且 uint32_tuint64_t 的大小永远不会改变,所以所有这些信息都是可用的在编译过程的每个阶段。我只是不知道如何访问它。

最佳答案

预处理器对模板、模板参数或类型一无所知。那是死胡同。

也许标签调度会让你的分析工具闭嘴。

template <typename WORD>
class Foo
{
public:
void Init();
private:
WORD* m_ptr;

template<std::size_t> struct size_tag {};
void Init_impl(size_tag<8>) { /* Do something */ }
void Init_impl(size_tag<4>) { /* Do something else */ }
};

template <typename WORD>
void Foo<WORD>::Init()
{
Init_impl(size_tag<sizeof(WORD)>());
}

关于c++ - 如何在带有模板参数的预处理器中使用 sizeof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33929567/

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