2010-07-14 108 views
10

有什麼辦法可以達到指定的行爲嗎? 如果有一些技巧,或者這可以使用traits或enable_if完成,請讓我知道。C++模板問題

template <typename T> struct Functional { 

    T operator()() const { 

     T a(5); 

       // I want this statement to be tranformed into 
       // plain 'return;' in case T = void 
     return a; // <--- 
    } 
}; 

int main() { 

    Functional<int> a; 
    a(); 

    Functional<void> b; 
    b(); // <--- Compilation error here 
} 
+8

可以在函數返回一個'void'表達式返回'void'所以你確定這一點的代碼,你您的其他功能存在更大的問題。 'T a(5)'不起作用。你不能有一個'void'類型的變量,所以一個簡單的'return a;'不會起作用。不知道你的班級模板的細節很難給出具體細節。 – 2010-07-14 10:19:04

回答

24

就專門爲無效:

template <typename T> struct Functional { 
    T operator()() const { 
     T a(5); 
     return a; 
    } 
}; 
template <> struct Functional<void> { 
    void operator()() const { 
    } 
}; 
3

你可以使用一個專門


template <> struct Functional<void> { 

    void operator()() const { 
    } 
}; 
1

這應該工作

template <> struct Functional<void> //specialized for 'void' 
{ 
    void operator()() const { 

     //do something 

     return ; //optional 
    } 
}; 

編輯:

你也可以寫(簡單的方法)

T operator()() const { 

    return T(5); // static_cast<> not even required 
} 
0

有更大的問題與此代碼不是第一次出現。例如,如果您要將Functional的返回值轉發給另一個函數,那麼您不能僅將void函數指定爲void,因爲如果您有一個函數使用void,則可以沒有把它表達出來。當然,你不能用void等變量來創建變量。總而言之,認爲虛構是非法的,而不是試圖對付它。

還有其他答案已經有明確的專業化答案。

10

只要說下面的話。它的工作原理非常清楚與Tvoid,相當於你已經證明

T operator()() const { 
    return static_cast<T>(5); 
} 
+3

+1:我不認爲大多數人知道你可以從返回類型爲void的函數中'返回'void'類型的表達式。 – 2010-07-15 00:18:44

+0

@Johannes:甚至需要'static_cast <>'? 'T運算符()()const {return T(t)}'可以用來代替。 – 2010-09-21 04:02:39

+0

@Prasoon Saurav:如果聲明「T t(e);」是格式良好的,對於某些發明的臨時變量t(e),表達式e可以使用static_cast的形式static_cast (e)顯式轉換爲T類型8.5)。所以兩者都是一樣的。當然你不能這樣做(void v(5))這就是爲什麼我猜標準有一個關於轉換爲void的明確註釋(在static_cast下)。我喜歡static_cast,因爲它是明確的 – Chubsdad 2010-09-21 04:15:45