我看过这样写的模板:
template<typename T, bool = is_integral<T>::value, bool = is_floating_point<T>::value>
struct helper {};
template<typename T>
struct helper<T, true, false>
{
typedef TypeAppropriateForThisSpecialization type;
};
然后使用
typename helper<T>::type t;
这是什么意思?这是否意味着true
- false
模板类型参数组合的专业化,如果它们被忽略,则由is_integral
和is_floating_point
进行评估? / p>
这是一样的吗? (这是变量声明/定义):
typename helper<T, true, false>::type t;
typename helper<T, is_integral<T>::value, is_floating_point<T>::value>::type t;
答案 0 :(得分:2)
这是什么意思?这是否意味着专业化 模板类型参数的真假组合,如果它们是 ommited,由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确实是整数而不是浮点,则上述类型定义将具有相同的结果,否则它们将具有不同的结果(在这种情况下::类型可能无效)。
此类代码可能在SFINAE中使用。请参阅more c++ idioms - enable 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;
}
答案 1 :(得分:1)
typename helper<T>::type t;
typename helper<T, is_integral<T>::value, is_floating_point<T>::value>::type t;
是一样的。
和帮助者&lt; T,true,false&gt;是专门的(所以当T是一个整数而不是在helper&lt; T&gt;中使用时的浮点数)。