网站开发 定制 合同 模板,网站做二级站,网站安全建设必要性,做网站需要那些东西1 SFINAE。
2 条件特化。可用作额外的函数参数#xff08;不可应用于运算符重载#xff09;、返回类型#xff08;不可应用于构造函数与析构函数#xff09;#xff0c;或类模板或函数模板形参。 函数参数#xff1a;
#include iostream
#include type_tra…1 SFINAE。
2 条件特化。可用作额外的函数参数不可应用于运算符重载、返回类型不可应用于构造函数与析构函数或类模板或函数模板形参。 函数参数
#include iostream
#include type_traits
using namespace std; template typename T
T addT(T value, typename std::enable_ifstd::is_integralT::value, T::type* nullptr)
{return value 10;
}template typename T
T addT(T value, typename std::enable_ifstd::is_floating_pointT::value, T::type* nullptr)
{return value 5;
}int main()
{int d 10;double f 20;d addT(d);f addT(f);return 0;}单独看这个例子是比较模糊因为编译器做了自动补充d addT(d, nullptr);通过如下网站可以展开上面代码
C Insights
#include iostream
#include type_traits
using namespace std;templatetypename T
T addT(T value, typename std::enable_ifstd::is_integralT::value, T::type *)
{return operator(value, 10);
}/* First instantiated from: insights.cpp:22 */
#ifdef INSIGHTS_USE_TEMPLATE
template
int addTint(int value, typename std::enable_ifstd::is_integralint::value, int::type *)
{return value 10;
}
#endiftemplatetypename T
T addT(T value, typename std::enable_ifstd::is_floating_pointT::value, T::type *)
{return operator(value, 5);
}/* First instantiated from: insights.cpp:23 */
#ifdef INSIGHTS_USE_TEMPLATE
template
double addTdouble(double value, typename std::enable_ifstd::is_floating_pointdouble::value, double::type *)
{return value 5;
}
#endifint main()
{int d 10;double f 20;d addT(d, nullptr);f addT(f, nullptr);return 0;
} 函数返回值
#include type_traits
#include iostreamtemplate typename T
typename std::enable_if std::is_integralT::value, T::type addT(T value)
{return value 10;
}template typename T
typename std::enable_if std::is_floating_pointT::value, T::type addT(T value)
{return value 5.0;
}int main()
{int d 10;double f 20;d addT(d); //d 20f addT(f); //f 25.000000000return 0;
}
std::is_integral 用法参考https://cplusplus.com/reference/type_traits/is_integral/
编译展开后的代码如下 #include type_traits
#include iostreamtemplatetypename T
typename std::enable_ifstd::is_integralT::value, T::type addT(T value)
{return value 10;
}/* First instantiated from: insights.cpp:20 */
#ifdef INSIGHTS_USE_TEMPLATE
template
typename std::enable_ifstd::is_integralint::value, int::type addTint(int value)
{return value 10;
}
#endiftemplatetypename T
typename std::enable_ifstd::is_floating_pointT::value, T::type addT(T value)
{return value 5.0;
}/* First instantiated from: insights.cpp:21 */
#ifdef INSIGHTS_USE_TEMPLATE
template
typename std::enable_ifstd::is_floating_pointdouble::value, double::type addTdouble(double value)
{return value 5.0;
}
#endifint main()
{int d 10;double f 20;d addT(d);f addT(f);return 0;
}模版类特化
#include type_traits
#include iostreamtemplate typename T, typename Enable void
class MyTestClass
{// 默认实现适用于所有类型
public:MyTestClass() {std::cout default;}
};template typename T
class MyTestClassT, typename std::enable_ifstd::is_integralT::value::type
{// 整型类型的特化实现
public:MyTestClass() {std::cout int;}
};template typename T
class MyTestClassT, typename std::enable_ifstd::is_floating_pointT::value::type
{// 浮点型类型的特化实现
public:MyTestClass() {std::cout float;}
};
int main()
{MyTestClassstd::string x1;// OK 匹配初等模板MyTestClassint x2; // OK 匹配偏特化 int MyTestClassdouble x3; // OK 匹配偏特化 doublereturn 0;
}
模版展开后代码如下
#include type_traits
#include iostreamtemplatetypename T, typename Enable void
class MyTestClass
{public: inline MyTestClass(){std::operator(std::cout, default);}};/* First instantiated from: insights.cpp:35 */
#ifdef INSIGHTS_USE_TEMPLATE
template
class MyTestClassstd::basic_stringchar, void
{public: inline MyTestClass(){std::operator(std::cout, default);}};#endif
/* First instantiated from: insights.cpp:36 */
#ifdef INSIGHTS_USE_TEMPLATE
template
class MyTestClassint, void
{public: inline MyTestClass(){std::operator(std::cout, int);}};#endif
/* First instantiated from: insights.cpp:37 */
#ifdef INSIGHTS_USE_TEMPLATE
template
class MyTestClassdouble, void
{public: inline MyTestClass(){std::operator(std::cout, float);}};#endiftemplatetypename T
class MyTestClassT, typename std::enable_ifstd::is_integralT::value::type
{public: inline MyTestClass(){std::operator(std::cout, int);}};templatetypename T
class MyTestClassT, typename std::enable_ifstd::is_floating_pointT::value::type
{public: inline MyTestClass(){std::operator(std::cout, float);}};int main()
{MyTestClassstd::basic_stringchar, void x1 MyTestClassstd::basic_stringchar, void();MyTestClassint, void x2 MyTestClassint, void();MyTestClassdouble, void x3 MyTestClassdouble, void();return 0;
}参考文档
https://cplusplus.com/reference/type_traits/is_integral/
std::enable_if - cppreference.com
C之std::enable_if_std enable if-CSDN博客
C模板编程 | std::enable_if 和 SFINAE_模板类 std::enable-CSDN博客