在我的模板中,我需要根據typename是否是基本類型來使用不同的代碼部分。C++:Use #if std :: is_fundamental <T> :: MSVC 2010中條件編譯的值
編譯此代碼給出MSVC一個C4067(以下預處理指令意外令牌 - 預計一換行):
template <typename T>
void MyClass<T>::foo()
{
// ... some code here
#if std::is_fundamental<T>::value
if(m_buf[j] < m_buf[idx_min])
idx_min = j;
#else
const ASSortable& curr = dynamic_cast<ASSortable&>(m_buf[j]);
const ASSortable& curr_min = dynamic_cast<ASSortable&>(m_buf[idx_min]);
// error checking removed for simplicity
if(curr.before(curr_min))
idx_min = j;
}
#endif
模板是既原始和我自己的(自ASSortable派生)工作的數據類型和錯誤從模板實例代碼拋出:
template class MyClass<char>;
試圖修改預編譯表達這個沒有工作之一:
#if std::is_fundamental<T>::value == true
併產生相同的確切警告。
任何想法如何使此代碼免受警告?
編輯我想到的另一件事是將其轉換成一個運行時檢查,並與「不變,如果表達式」警告住......難道真的沒有辦法做到這一點優雅的單函數沒有專精,沒有額外的膨脹?
編輯#2所以我的方式解決了這個(這是顯而易見的,但不知何故逃過了我......)是定義bool ASSortable::operator<(const ASSortable& _o) const {return this->before(_o);};
該做的工作,使代碼乾淨(再一次)。
沒有更多if
s或#ifdef
s或我的代碼中的任何類似的混亂!
不能相信我甚至問這個問題,因爲它有這樣一個明顯的和簡單的答案:(
難道你不能使用「MyClass」的特化? – 2012-07-12 12:44:35
我試圖不要污染太多專業化的實施。考慮到MyClass將專門用於很多基本類型,並且代碼太雜亂(專業化將覆蓋char/short/int/long/long long和它們的未簽名對應,float/double/long double) d真的只是有一個條件編譯,而不是複製基本類型的每個專業化代碼塊 – YePhIcK 2012-07-12 12:47:34
@YePhIcK您總是可以使用'enable_if'來防止爲一個專門的過載專門化一個類。我的解決方案做到了。 – pmr 2012-07-12 13:17:37