2015-11-26 145 views
2

我有一個像下面這樣的模板類。它意味着要用32位字或64位字實例化。如何在預處理器中使用sizeof和模板參數?

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 "(" GCC下的;和token is not a valid binary operator in a preprocessor subexpression根據Cla。

我不想提供單獨的專業化,因爲這是代碼模板的確切種類。我也相信它會破壞我們用基類指針和引用(在派生類中)做的一些事情。

如何訪問模板參數WORD的大小並使用它來選擇代碼路徑?


下面的工作很好,但它生成我試圖壓制警告。例如,它產生Coverity的下result_independent_of_operands

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

我也得到了預處理器的編譯器之前運行。我對此沒有任何誤解(例如,sizeof() is not executed by preprocessor和朋友)。

但是,源代碼在預處理器運行之前很久就被保存下來,並且uint32_tuint64_t的大小永不改變,因此所有這些信息在編譯過程的每個階段都可用。我只是不知道如何訪問它。

+1

我認爲功能應該聲明'constexpr'即用'-std = C++ 11'標誌 – smac89

+1

到底有什麼不對勁只'如果(的sizeof(WORD)== 4){... }'?使用預處理器肯定是死路一條。 –

+0

@ T.C。 - 正如我所解釋的,它會在分析工具下產生警告。清潔的編譯和清理分析是我們的安全門,所以我們竭盡全力與所有工具配合使用。 – jww

回答

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)>()); 
} 
相關問題