SFINAE 超出过载分辨率
SFINAE outside of overload resolution?
在他的演讲《现代模板元编程:纲要第一部分》中,Walter Brown 讨论了enable_if与 SFINAE 的相互作用。
在演讲中大约47:40,他被问到一个问题,我无法完全匹配他的回答。然而,这听起来的关键是,他说SFINAE与过载分辨率分开,恰好常用于函数的过载分辨率。
我理解他的回答的方式是,他也在说SFINAE有另一种用途。
除了过载分辨率之外,还可以在哪里应用 SFINAE?在听到他对这个问题的回答之前,我的理解是它唯一的用途是过载解决。
编辑:谈话在这里 https://www.youtube.com/watch?v=Am2is2QCvxY
如果您认为合适,可以根据参数禁用任何模板。
例如,可以想象矩阵类只能用算术类型实例化。 也就是说,我们希望允许实数和整数的矩阵,但不允许字符串的矩阵。 你可以这样做:
#include <type_traits>
template<typename T,
typename = typename std::enable_if<std::is_arithmetic<T>::value>::type>
class Matrix
{
// ...
};
现在,如果用户Matrix<double> m {}
它将愉快地编译,但Matrix<std::string>
会给出一个简单的错误消息,指出未定义此类类型。 这可能比矩阵类的某些内部没有为std::string
操作数生成有效代码的错误消息页面更能帮助用户。
另一个用例是在模板的部分专用化中进行选择。 这可能是一个愚蠢的例子,但它可能会给你一个想法。 假设我们有一个模板,它采用两个类型参数,并希望专门用于它们都引用同一类型的情况。 但是,如果类型小于int
,则专用化(出于某种模糊的原因)比主模板差,因此在这种情况下我们不希望它。
#include <iostream>
#include <type_traits>
template<typename T1, typename T2>
struct X
{
void
operator()()
{
std::cout << "I'm the primary template." << std::endl;
}
};
template<typename T>
struct X<T, typename std::enable_if<(sizeof(T) >= sizeof(int)), T>::type>
{
void
operator()()
{
std::cout << "I'm the partial specialization." << std::endl;
}
};
int
main()
{
X<int, float> int_float {}; // primary template
X<int, int> int_int {}; // partial specialization
X<char, char> char_char {}; // primary template!
int_float();
int_int();
char_char();
}
我的系统上的输出:
I'm the primary template.
I'm the partial specialization.
I'm the primary template.
相关文章:
- 为什么使用SFINAE而不是函数重载
- 如何使用模板函数的函数签名进行SFINAE
- 数据成员SFINAE的C++17测试:gcc vs clang
- 使用在用于SFINAE的void_t中具有参数的方法
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 提供与TMP和SFINAE的通用接口
- "Inverse SFINAE"避免模棱两可的过载
- 使用分辨率定理用Z3证明
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- Opencv 恢复到比我设置的更高的分辨率
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何在儿童类中使用SFINAE
- 使用 SFINAE 作为模板参数的编译时递归
- 使用 SFINAE 设计模板方法
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 与SFINAE支票交朋友
- C++许多 SFINAE 风格的过载
- C++ SFINAE - 标准::is_arithmetic 和标准::is_same之间的分辨率优先级
- SFINAE 超出过载分辨率
- 使用SFINAE分辨率区分普通模板参数和模板模板参数的技术