1
通常基於一類使用enable_if
當模板類型,有必要複製類的模板類型作爲構造或方法的模板參數:當啓用基於它的構造函數時,是否總是需要複製類模板參數?
template <
typename U = T,
typename = typename std::enable_if<
!std::is_void<U>::value
>::type
>
Class() { }
當恰好這是必要的(或不) ?
例如,下面的代碼編譯罰款G ++,鏘和VC++ ...
template <typename T = void>
class Class {
public:
template <
typename U,
typename = typename std::enable_if<
// Is the use of T here allowed?
std::is_void<T>::value
|| std::is_base_of<T, U>::value
>::type
>
Class(U &&arg) {
std::cout << "Derived" << std::endl;
}
template <
typename U,
typename ...U_Rest,
typename = typename std::enable_if<
// Is the use of T here allowed?
!std::is_void<T>::value
&& !std::is_base_of<T, U>::value
>::type
>
Class(U &&arg, U_Rest &&...rest) {
std::cout << "Not Derived" << std::endl;
}
};
...,而是直接使用T
作爲enable_if
的一部分。具體而言,如果T
爲void
,則始終啓用構造函數的「派生」版本,並且始終禁用「未派生」版本,無論參數U
如何。
以上實際是否按照標準合法?或者編譯器是否接受它,可能是由於「不需要診斷」?
在我發佈的情況下,如果'T'爲'void',則條件不依賴於'U'。從你的回答中我收集到這將違法? – zennehoy
關於風格的好處。我在這種情況下使用'typename = std :: enable_if_t'的原因是這個實現是在一個單獨的'.hpp'中,我不想複製'enable_if'條件。 – zennehoy
@zennehoy:你有'true || std :: is_base_of :: value',你考慮短路,但第二個操作數可能會返回特殊類型,並且重載'operator ||'。所以這取決於。我會懷疑'真實|| sizeof(U)== 4',但我認爲它依賴於'U'的存在。 –
Jarod42