SFINAE 过载选择有或没有操作员<<
SFINAE overload choice for has or has not operator<<?
考虑以下两个函数:
template <class Type,
class = typename std::enable_if</*HAS OPERATOR <<*/>::type>
void f(std::ostream& stream, const Type& value);
template <class Type,
class... DummyTypes,
class = typename std::enable_if<sizeof...(DummyTypes) == 0>::type>
void f(std::ostream& stream, const Type& value, DummyTypes...);
由于非可变参数重载优先于可变参数重载,因此我想检查该类型是否具有第一个版本中使用 std::enable_if
的std::ostream
operator<<
。
那么我应该写什么而不是/*HAS OPERATOR <<*/
?
以下内容应该有效
template <class Type,
class = decltype(std::declval<std::ostream&>() << std::declval<Type>())>
void f(std::ostream& stream, const Type& value)
{
stream << value;
}
(请注意,在这种情况下,您不需要使用 std::enable_if
)
使用尾随返回类型 (1),您实际上可以预感概念:
template <typename Type>
auto f(std::ostream& out, Type const& t) -> decltype(out << t, void()) {
// ...
}
由于 SFINAE,只有在可以解析out << t
类型时才能选择此重载,这意味着存在接受这两个参数的重载 <<
。
一个陷阱是,如果您需要相反的方法,这将不起作用,即如果此重载不存在,则启用函数。据我所知,在这种情况下,enable_if
策略(和对称disable_if
)是必要的。
(1)感谢Simple
当你有参数时,检查是最容易的,即,我宁愿尝试使用这样的东西:
template <typename Type>
auto f(std::ostream& out, Type const& value)
-> typename std::enable_if<sizeof(out << value) != 0>::type {
...
}
使用 std::declval()
可以获得类似的效果,但我不确定是否创建引用。
相关文章:
- 如何使用默认参数等选择模板专业化
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- QTreeView幻灯片多选后无法使用单击选择
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 在C++中,如何通过几种类型从元组中选择多个元素
- <<操作员在下面的行中工作
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 对可变参数使用声明.如何选择正确的功能
- 选择选举获胜者的程序
- 如何选择在 csv 文件中输出的位置
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- C++ 与操作员不匹配<<
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 操作员C++的模棱两可的过载
- 选择和修改嵌套向量中的条目的最佳实践
- C 如何选择要在(类)中使用的操作员
- SFINAE 过载选择有或没有操作员<<