考慮這個例子:檢查類型被定義
#include <iostream>
#include <type_traits>
template <class, class = void>
struct is_defined : std::false_type
{ };
template <class T>
struct is_defined<T,
std::enable_if_t<std::is_object<T>::value &&
!std::is_pointer<T>::value
>
> : std::true_type
{
private:
static const T test; //try to create incomplete type member
};
struct defined { };
struct forward_declared;
int main()
{
std::cout << std::boolalpha
<< is_defined<defined>::value << std::endl
<< is_defined<forward_declared>::value << std::endl;
}
輸出是true
兩者。我想如果我嘗試使不完整類型的成員struct
成員,那麼這個模板專門化將從超載設置中丟棄。但事實並非如此。刪除static const
會導致不完整的編譯時錯誤。這種方法有什麼問題,如果可能的話,怎麼能實現呢?
'is_object'並不意味着'is_complete'。 –
@ n.m。這只是爲了不允許檢查參考。我可以使用'std :: is_reference'來代替,但這並沒有太大的不同。 – xinaiz
好的我看到你正在試圖聲明一個靜態的東西去除不完整的類型。無論如何,你需要使用ODR來使用靜態的東西。 –