c++ - 没有 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
,我希望使用第一个模板。但是如果不支持 by 类型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_if
or的情况下消除这种歧义enable_if_t
?通过 SFINAE 和表达式保持程序简单。其实decltype(to_string(t))
很清楚。但是,类型没有not
或otherwise
运算符。
解决方案
您可以使用额外的参数来优先考虑您的重载:
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>{});
}
推荐阅读
- python - 如何在我的 Flask/SQLAlchemy 应用程序中更新 SQLite 的版本?
- kubernetes - Kubenetes 入口 API 路由
- swift - 在 List 上显示一组对象
- python - 使用 iloc 和列表推导来设置值
- javascript - Sequelize - 多对多关系模型 A 与模型 B 无关
- python - XPath: Select All Text of Descendants where first Div attribute matches condition
- r - Weekly data with BatchGetSymbols (package in R)
- laravel - 从邮件刀片模板中的一个数组获取属性
- c++ - 如何找到每一行的最大值和最小值
- javascript - 使用javascript将椭圆转换为路径