2017-03-17 47 views
2

我複製了以下Stackoverflow中的一個成員的代碼片段。它運作良好。多謝你們!如何使用enable_if設置以下C++代碼的返回類型

但是,我想不通哪裏是定義的返回值。任何人都可以向我解釋什麼是返回值的類型?

如果我想將返回值類型更改爲void(無返回值),該怎麼辦?

另外,在這段代碼中有typename Dummy的意義是什麼?爲什麼有一個'...'?

任何人都可以給出解釋嗎?謝謝!

template<typename Traits> 
class Robot { 

public: 
    template<typename... Dummy, typename U = Traits> 
    typename std::enable_if<std::is_base_of<ResearchTraits, U>::value>::type 
    MyFunction() { 
     static_assert(sizeof...(Dummy) == 0, "Do not specify template arguments!"); 
     std::cout << "research based." << std::endl; 
    } 

    template<typename... Dummy, typename U = Traits> 
    typename std::enable_if<std::is_base_of<ProductionTraits, U>::value>::type 
    MyFunction() { 
     static_assert(sizeof...(Dummy) == 0, "Do not specify template arguments!"); 
     std::cout << "production based." << std::endl; 
    } 
}; 

回答

2

如果你看一下std::enable_if,你看enable_if有兩個模板參數,第二默認爲void

template< bool B, class T = void > 

在你的情況,B等於std::is_base_of<ResearchTraits, U>::value,並且省略T,因此默認爲void

從同一頁:

如果B爲真,則std :: enable_if具有公共成員typedef類型,等於 到T;否則,沒有成員typedef。

你的返回類型是std::enable_if<...>::type,因而是等於T,而你的情況是void

+0

這是'選擇'使用哪個成員函數的正常做法?或者有專門針對這種選擇的專用語法? MyFunction的返回類型總是無效的,所以我不需要選擇任何東西? – user152503

+0

看起來像這是一種指定不同函數重載的方法,具體取決於'Robot'的模板參數是從'ProductionTraits'還是'ResearchTraits'派生的。我不完全確定它是否也在做別的事情,所以我會把這個問題留給有人更多知道這個 – smead

+0

'Dummy'變量阻止用戶使用自定義模板參數調用該函數,強制'U'始終默認爲「特質」。我想不出爲什麼這將是必要的,而不是直接將'Traits'直接插入'is_base_of' – smead

相關問題