1

我见过这样写的模板:

    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_integraland评估is_floating_point

这是一样的吗?(这是一个变量声明/定义):

typename helper<T, true, false>::type t;

typename helper<T, is_integral<T>::value, is_floating_point<T>::value>::type t;
4

2 回答 2

2

这是什么意思?这是否意味着模板类型参数的真假组合有一个专门化,如果它们被省略,则由 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;
}
于 2013-08-21T21:46:29.653 回答
1
typename helper<T>::type t;
typename helper<T, is_integral<T>::value, is_floating_point<T>::value>::type t;

是相同的。

并且 helper<T, true, false> 是特化的(所以当 T 是整数但在 helper<T> 中使用时不是浮点数时)。

于 2013-08-21T19:21:48.173 回答