在Checking a member exists, possibly in a base class, C++11 version中,我們開發了一個C++ 11版本的經典成員檢查類型特徵SFINAE to check for inherited member functions,它也適用於C++ 11 final
類,但使用C++ 11層的功能(即,decltype
),得:檢查一個成員是否存在,可能在一個基類中,VS2005/08版本
template<typename T>
class has_resize_method {
struct Yes { char unused[1]; };
struct No { char unused[2]; };
static_assert(sizeof(Yes) != sizeof(No));
template<class C>
static decltype(std::declval<C>().resize(10), Yes()) test(int);
template<class C>
static No test(...);
public:
static const bool value = (sizeof(test<T>(0)) == sizeof(Yes));
};
MSVC已final
作爲名爲因爲VS2005 sealed
非標準擴展,但decltype
只在VS2010被添加。這留下了VS2005和2008,其中一個標記爲sealed
的類仍然打破了傳統的類型特徵,並且C++ 11版本不能使用。
那麼,有沒有一種方法可以制定has_resize_method
,這樣它也可以在類VC2005/08 sealed
上運行?很顯然,就像使用C++ 11-only特性來解決C++ 11-only問題(final
)一樣好,所以將使用VS-only擴展來解決VS2005/08-only問題sealed
類的問題,但如果有一種解決方案適用於所有三套編譯器{C++ 11,{VS2005,VS2008},所有其他},那將很酷,但可能要求太多:)
您可以用最小的代碼示例來擴展您的問題,以便更大的受衆更清楚地瞭解問題。 – iammilind 2012-03-07 11:08:06
'template static decltype(std :: declval ().resize(10),Yes())test(int);'不能在MSVC2010下編譯(意外的文件結尾)。由於代碼格式良好,它似乎是一個編譯器錯誤。 –
2012-03-08 09:58:49
@dark_charlie:它可以與'static_cast(0) - > resize(10)'而不是'std :: declval'一起使用嗎? –
2012-03-08 10:57:11