这是什么意思?这是否意味着模板类型参数的真假组合有一个专门化,如果它们被省略,则由 is_integral 和 is_floating_point 评估?
代码背后的想法是要么选择定义类型的特化,要么选择另一个(未定义类型)。
如果助手的用户没有指定默认模板参数。如果类型 T 是整数而不是浮点值,则应选择特化,否则应选择非特化模板。
这是一样的吗?(这是一个变量声明/定义):
typename helper<T, true, false>::type t;
typename helper<T, is_integral<T>::value, is_floating_point<T>::value>::type t;
如果 T 确实是整数而不是浮点,则上述类型定义将具有相同的结果,否则它们将具有不同的结果(在这种情况下 ::type 可能无效)。
这种类型的代码可能会在 SFINAE 中使用。查看更多 c++ 习惯用法 - 以启用 if为例。您还可以查看 boost::enable_if。如果您能给我们一个使用示例,那就太好了。
这个(成语)将用于根据 T 的属性在重载集中选择不同的函数,而不仅仅是类型(有关 enable_if 的类似用法,请参见下面的示例)。
#include <type_traits>
#include <iostream>
#include <string>
template <class T>
typename std::enable_if<std::is_floating_point<T>::value>::type foo( T )
{
std::cout << "T is a float" << std::endl;
}
template <class T>
typename std::enable_if<
std::is_integral<T>::value &&
std::is_unsigned<T>::value>::type foo( T )
{
std::cout << "T is integral and unsigned" << std::endl;
}
template <class T>
typename std::enable_if<
std::is_integral<T>::value &&
std::is_signed<T>::value>::type foo( T )
{
std::cout << "T is integral and signed" << std::endl;
}
template <class T>
typename std::enable_if<
!(std::is_integral<T>::value || std::is_floating_point<T>::value)>::type
foo( T )
{
std::cout << "T is neiter integral nor float" << std::endl;
}
int main()
{
foo( 10u );
foo( 10 );
foo( 10.2 );
foo( std::string() );
return 0;
}