「メンバーのチェック」では、おそらく基本クラスのC ++ 11バージョンで、C++でも機能する継承されたメンバー関数をチェックするためにSFINAEからC++11バージョンの従来のメンバーチェックタイプ特性を開発しました。 11final
クラスですが、C ++ 11機能(つまり、decltype
)も使用します。
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は、VS2005以降に名前がfinal
付けられた非標準の拡張機能として使用されていますが、VS2010でのみ追加されています。そのため、VS2005と2008では、マークされたクラスが従来の型特性を破り、C++11バージョンを使用できなくなります。sealed
decltype
sealed
それで、has_resize_method
VC2005 / 08sealed
クラスでも機能するように定式化する方法はありますか?
明らかに、C++11のみの機能を使用してC++11のみの問題()を回避するのと同じように、VSのみの拡張機能を使用してクラスfinal
のVS2005/08のみの問題を回避しますがsealed
3セットのコンパイラ{C++11、{VS2005、VS2008}、その他すべて}で機能するソリューションがあるとしたら、それはすばらしいことですが、多分多すぎて要求できません:)