0
近日在回答一個問題在這裏if-else depends on whether T is a complete type我意識到,下面無法編譯關於SFINAE爲不完全類型
#include <iostream>
#include <type_traits>
using namespace std;
class Incomplete;
class Complete {};
template <typename IncompleteType>
struct DetermineCompleteHelper : public IncompleteType {};
template <typename IncompleteType, typename = std::enable_if_t<true>>
struct DetermineComplete {
static constexpr const bool value = false;
};
template <typename IncompleteType>
struct DetermineComplete<IncompleteType, std::enable_if_t<std::is_same<
decltype(DetermineCompleteHelper<IncompleteType>{}),
decltype(DetermineCompleteHelper<IncompleteType>{})>::value>> {
static constexpr const bool value = true;
};
int main() {
cout << DetermineComplete<Complete>::value << endl;
cout << DetermineComplete<Incomplete>::value << endl;
return 0;
}
但改變局部模板專業化
template <typename IncompleteType>
struct DetermineComplete<IncompleteType, std::enable_if_t<std::is_same<
std::integer_sequence<int, sizeof(IncompleteType)>,
std::integer_sequence<int, sizeof(IncompleteType)>>::value>> {
static constexpr const bool value = true;
};
特殊規則使代碼編譯沒有錯誤,爲什麼這種不規範?不應該將第一個表達式視爲部分特化的上下文中的錯誤,並因此讓SFINAE啓動並使該類的默認定義成爲實例化的類型?
在直接上下文中,sizeof(DetemineCompleteHelper)如何?這樣做是否也會嘗試查看實例化類的大小? –
Curious
@Curious你的「編譯」例子是'sizeof(IncompleteType)'。 –
... nvm,我問得太快了,應該先閱讀我之前寫的代碼 – Curious