如何在带有模板参数的预处理器中使用sizeof
How to use sizeof in preprocessor with a template parameter?
我有一个模板类,如下所示。它意味着用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
}
编译它会导致GCC下的error: missing binary operator before token "("
;和Clang下的token is not a valid binary operator in a preprocessor subexpression
。
我不想提供单独的专业化,因为这正是代码模板的初衷。我还相信它将打破我们对基类指针和引用(在派生类中)所做的一些事情。
如何访问模板参数WORD
的大小并使用它来选择代码路径?
以下内容会很好,但它会产生警告,我正试图压制。例如,它在Coverity:下生成result_independent_of_operands
WORD unused;
if (sizeof(unused))
{
...
}
我还了解到预处理器在编译器之前运行。我对此没有误解(例如,sizeof()不是由预处理器和朋友执行的)。
但是,早在预处理器运行之前,源代码就已经保存了,而且uint32_t
和uint64_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)>());
}
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- 所有结构成员的预处理器批处理
- 当头文件被预处理时是否有一个预处理器选项显示?