2
我正在使用VS2015更新3.我有一個函數,我希望根據可調用對象的返回類型進行專門化。當可調用對象是一個仿函數時,一切都按預期工作。當可調用對象是函數或函數指針時,它無法專門化重載函數。我覺得我失去了一些顯而易見的東西,但是我在一年之內沒有對SFINAE做過任何事情。未能專門爲函數指針功能
我錯過了什麼導致了專業化失敗?
template <typename T>
struct S
{
T mOp;
template <typename = void>
typename std::enable_if<
std::is_same<
std::remove_cv_t<
std::remove_reference_t<
decltype(mOp())
>
>,
void
>::value
>::type func()
{
std::cout << "bool" << std::endl;
}
template <typename = void>
typename std::enable_if<
std::is_same<
std::remove_cv_t<
std::remove_reference_t<
decltype(mOp())
>
>,
bool
>::value
>::type func()
{
std::cout << "void" << std::endl;
}
};
template <typename T>
auto createS(T&& t)
{
return S<T>{ t };
}
void vfunc()
{
}
bool bfunc()
{
return true;
}
struct vfunctor
{
void operator()()
{
}
};
struct bfunctor
{
bool operator()()
{
return true;
}
};
void func()
{
createS(bfunc).func(); // Fails to specialize func()
createS(vfunc).func(); // Fails to specialize func()
createS(vfunctor{}).func();
createS(bfunctor{}).func();
}