SFINAE有問題。我需要能夠確定一個Type是否有一個成員函數operator-> defined,而不管它的返回類型。示例如下。SFINAE - 嘗試確定模板類型是否具有「變量」返回類型的成員函數
這個類在測試儀中。它用一個返回類型X *定義了operator - >()。因此我不會知道'X'是什麼地方硬編碼到處。
template <class X>
class PointerX
{
...
X* operator->() const;
...
}
該類試圖確定傳入的T是否有一個方法operator-> defined;不管什麼運營商 - >返回類型。
template<typename T>
struct HasOperatorMemberAccessor
{
template <typename R, typename C> static R GetReturnType(R (C::*)()const);
template<typename U, typename R, R(U::*)()const> struct SFINAE{};
template<typename U> static char Test(SFINAE<U, decltype(GetReturnType(&U::operator->)), &U::operator-> >*);
template<typename U> static uint Test(...);
static const bool value = sizeof(Test<T>(0)) == sizeof(char);
};
除了operator-> return類型必須是'Object'之外,該類與上面完全相同。
template<typename T>
struct HasOperatorMemberAccessorOBJECT
{
template <typename R, typename C> static R GetReturnType(R (C::*)()const);
template<typename U, typename R, R(U::*)()const> struct SFINAE{};
template<typename U> static char Test(SFINAE<U, Object*, &U::operator-> >*); // only change is we hardcoded Object as return type.
template<typename U> static uint Test(...);
static const bool value = sizeof(Test<T>(0)) == sizeof(char);
};
結果:
void main()
{
HasOperatorMemberAccessor<PointerX<Object>>::Test<PointerX<Object>>(0); // fails ::value is false; Test => Test(...)
HasOperatorMemberAccessorOBJECT<PointerX<Object>>::Test<PointerX<Object>>(0); // works! ::value is true; Test => Test(SFINAE<>*)
}
HasOperatorMemberAccessor無法找到PointX的成員函數 「對象操作符 - >()const的」。因此它使用Test的通用版本Test(...)。
然而,HasOperatorMemberAccessorOBJECT能夠找到PointX的 「對象操作符 - >()const的」。因此它使用Test專業版本測試(SFINAE *)。
雙方應該已經能夠找到「對象操作符 - >()const的」方法;因此兩者都應該使用Test的專業版本測試(SFINAE *);因此HasOperatorMemberAccessor> :: value對於兩者都應該爲true。
HasOperatorMemberAccessor和HasOperatorMemberAccessorOBJECT之間的唯一區別是,HasOperatorMemberAccessorOBJECT具有硬編碼到對象類型名稱R,
所以問題是,「decltype(GetReturnType(&û::操作符 - >))」沒有返回對象正確。我已經嘗試了許多不同的發現返回類型的許可證。他們走如下:
decltype(GetReturnType(&U::operator->))
typename decltype(GetReturnType(&U::operator->))
decltype(((U*)nullptr)->operator->())
typename decltype(((U*)nullptr)->operator->())
沒有工作,爲什麼?我正在使用MSVC++ 10.0。
一件事是,'PointerX ::操作符 - >''返回布爾*','不bool'。 –
2012-04-26 20:13:19
就HasOperatorMemberAccessor而言,PointerX中X的類型並不重要。我試圖通過不向該示例添加許多無關對象來概括我的問題。如果它太混亂,我會改變布爾到字符串。 – 2012-04-26 20:17:57
讓我再試一次.'PointerX