SFINAE应用一

SFINAE(substitution failure is not an error),即匹配失败不是错误

#include <iostream>
using namespace std;

struct Test
{
	typedef int type;
};

template <typename T>
void f(typename T::type)
{
	cout<< "one" <<endl;
}

template<typename T>
void f(T)
{	
	cout<< "two" <<endl;
}

void main()
{
	f<Test>(10);
	f<int>(10);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SFINAE(Substitution Failure Is Not An Error)是C++模板元编程中的一种技术,它利用了模板参数替换失败不报错的特性,可以在编译期间自动过滤掉不符合条件的模板实例化。 SFINAE的基本用法是通过函数重载和模板特化来实现的。具体步骤如下: 1. 定义一个模板函数或者模板类,其中包含一个或多个“不确定”的类型参数。 2. 在函数或者类中使用这些模板参数来实现具体功能。 3. 定义一个辅助函数或者类,用于检查某些条件是否成立。 4. 在辅助函数或者类中定义一个静态常量或者静态函数,用于返回bool类型的值表示条件是否成立。 5. 使用函数重载或者模板特化的方式,根据条件成立与否来选择具体的实现。 下面是一个简单的示例代码,演示了如何使用SFINAE来实现一个函数模板,用于计算两个数中较大的那个数: ```cpp #include <type_traits> template<typename T> typename std::enable_if<std::is_integral<T>::value, T>::type max(T a, T b) { return a > b ? a : b; } template<typename T> typename std::enable_if<std::is_floating_point<T>::value, T>::type max(T a, T b) { return a > b ? a : b; } int main() { int i = 1, j = 2; float x = 1.0f, y = 2.0f; max(i, j); // 返回值为2 max(x, y); // 返回值为2.0f return 0; } ``` 在上面的代码中,我们定义了两个模板函数max,一个处理整数类型,另一个处理浮点类型。为了保证模板参数只能是整数类型或者浮点类型,我们使用了std::enable_if和std::is_integral/std::is_floating_point来进行条件判断。如果条件成立,那么函数返回类型就是T,否则函数不会被实例化。在main函数中,我们分别调用了两个max函数,得到了正确的结果。 需要注意的是,SFINAE技术并不适用于所有情况,有些复杂的类型判断可能需要使用更高级的技术。此外,SFINAE还有一些陷阱和注意事项,需要谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值