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

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_tuint64_t永远不会改变,因此所有这些信息可在编译过程的每一个阶段.我只是不知道如何访问它.

T.C*_*.C. 6

预处理器对模板,模板参数或类型一无所知.那是死路一条.

也许标签调度会使您的分析工具闭嘴.

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)