表达没有enable_if的SFINAE?



我编写了一个程序,如下所示

#include <iostream>
#include <vector>
#include <string>
using namespace std;
template <typename T>
auto serialize(const T& t) -> decltype(to_string(t))
{
return to_string(t);
}
template <typename T>
auto serialize(const T& t) -> string
{
return "<object>";
}

int main()
{
cout<<serialize(4)<<endl;
cout<<serialize(vector<int>())<<endl;
return 0;
}

当程序类型由to_string支持时,我希望使用第一个模板。但是,如果不支持to_string的类型,那么我希望使用第二个模板。

我希望看到以下结果

4
<object>

但是当我编译程序时,出现以下错误

main.cpp: In function ‘int main()’:
main.cpp:22:19: error: call of overloaded ‘serialize(int)’ is ambiguous
cout<<serialize(4)<<endl;
^
compilation terminated due to -Wfatal-errors.

我实际上不能责怪编译器。如何在不使用enable_ifenable_if_t的情况下消除这种歧义。通过SFINAE保持程序简单与表达。事实上,decltype(to_string(t))很清楚。但是,类型没有nototherwise运算符。

您可以使用额外的参数确定重载的优先级:

template <std::size_t N> struct OverloadPriority : OverloadPriority<N -1> {};
template <> struct OverloadPriority<0> {};
template <typename T>
auto serialize_impl(const T& t, OverloadPriority<1>) -> decltype(to_string(t))
{
return to_string(t);
}
template <typename T>
auto serialize_impl(const T& t, OverloadPriority<0>) -> std::string
{
return "<object>";
}
template <typename T>
decltype(auto) serialize(const T& t)
{
return serialize_impl(t, OverloadPriority<1>{});
}

演示

相关内容

  • 没有找到相关文章

最新更新