鉴于:
struct A
{
virtual bool what() = 0;
};
template<typename T, typename Q>
struct B : public A
{
virtual bool what();
};
我想部分专业化what
,例如:
template<typename T, typename Q>
bool B<T, Q>::what()
{
return true;
}
template<typename Q>
bool B<float, Q>::what()
{
return false;
}
但似乎这是不可能的(是在 C++11 中吗?)所以我尝试了 SFINAE:
template<typename T>
typename std::enable_if<std::is_same<T, float>::value, bool>::type B<T>::what()
{
return true;
}
template<typename T>
typename std::enable_if<!std::is_same<T, float>::value, bool>::type B<T>::what()
{
return false;
}
这也不起作用,我不知道为什么,有人吗?所以我找到了这个线程并最终得到:
template<typename T, typename Q>
struct B : public A
{
virtual bool what()
{
return whatimpl(std::is_same<T, float>());
}
bool whatimpl(std::false_type)
{
return false;
}
bool whatimpl(std::true_type)
{
return true;
}
};
这个最终解决方案有效,但为什么该enable_if
技术不起作用?我也非常愿意接受我尚未遇到的更简洁答案的建议。
我尽可能地简化了我的例子——在我的真实用例what()
中不叫什么,实际上做了很多工作,我想“专门化”一个用户定义的类型,而不是float
.