模板专业化与默认值

时间:2013-08-21 19:07:22

标签: c++ templates c++11 sfinae

我看过这样写的模板:

    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_integralis_floating_point进行评估? / p>

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

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

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

2 个答案:

答案 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;中使用时的浮点数)。