使用由 Visual Studio 中的 decltype 派生的 Return 类型专门化模板

Specializing a Template With a Return Type Derived by decltype in Visual Studio

给定以下代码:

template<typename ValueType>
decltype(ValueType{} == ValueType{}) Compare(const ValueType& value, const ValueType& expected)
{
    return value == expected;
}

template<>
decltype(float{} == float{}) Compare<float>(const float& value, const float& expected)
{
    return std::abs(value - expected) < 1e-4F;
}

我希望调用 Compare(13.0F, 42.0F) 能够正确调用专业化 which it does on gcc. But it fails to on 。我收到错误:

error C2912: explicit specialization bool Compare<float>(const float &,const float &) is not a specialization of a function template

我能做些什么来帮助指导

纯粹为了安抚 VC++,您可以提取 return 类型作为另一个模板参数。

template<typename ValueType, typename RetType = decltype(ValueType{} == ValueType{})>
RetType Compare(const ValueType& value, const ValueType& expected)
{
    return value == expected;
}

template<>
decltype(float{} == float{}) Compare<float>(const float& value, const float& expected)
{
    return std::abs(value - expected) < 1e-4F;
}

这使得 VC++ 接受代码。