jww*_*jww 2 c++ c-preprocessor
我有一个类似下面的模板类.它旨在用32位字或64位字进行实例化.
foo.h
template <typename WORD>
class Foo
{
public:
...
void Init();
...
private:
WORD* m_ptr;
};
Run Code Online (Sandbox Code Playgroud)
foo.cpp
template <typename WORD>
void Foo<WORD>::Init()
{
#if (sizeof(WORD) == 8)
// Do something
#elif (sizeof(WORD) == 4)
// Do something else
#endif
}
Run Code Online (Sandbox Code Playgroud)
error: missing binary operator before token "("根据海湾合作委员会编制的结果; 并token is not a valid binary operator in a preprocessor subexpression锵下.
我不想提供单独的专业化,因为这是代码模板的确切类型.我也相信它会破坏我们对基类指针和引用(在派生类中)所做的一些事情.
如何访问模板参数的大小WORD并使用它来选择代码路径?
以下工作正常,但它会产生警告,我试图压制.例如,它会生成一个result_independent_of_operands封底:
WORD unused;
if (sizeof(unused))
{
...
}
Run Code Online (Sandbox Code Playgroud)
我也得到预处理器在编译器之前运行.我对此没有误解(例如,预处理器和朋友不执行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)>());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |