C ++模板:根据模板参数的值选择不同的类型

时间:2011-11-23 13:39:17

标签: c++ templates

如何在C ++中完成以下任务,以及正在做什么呢?

template <bool S>
class NuclearPowerplantControllerFactoryProviderFactory {
  // if S == true
  typedef int data_t;
  // if S == false
  typedef unsigned int data_t;
};

2 个答案:

答案 0 :(得分:14)

通过专业化

template <bool> class Foo;

template <> class Foo<true>
{
  typedef int data_t;
};

template <> class Foo<false>
{
  typedef unsigned int data_t;
};

您可以选择将两种情况中的一种作为主要模板,另一种作为专业化,但我更喜欢这种更对称的版本,因为bool只能有两个值。


如果这是您第一次看到这个,您可能还想考虑部分专业化:

template <typename T> struct remove_pointer     { typedef T type; };
template <typename U> struct remove_pointer<U*> { typedef U type; };


正如@Nawaz所说,最简单的方法可能是#include <type_traits>并说:

typedef typename std::conditional<S, int, unsigned int>::type data_t;

答案 1 :(得分:6)

@Kerrek已经充分回答了这个问题,但这可能更通用如下:

template<bool b, typename T, typename U>
struct select
{
    typedef T type;
};
template<typename T, typename U>
struct select<false, T, U>
{
    typedef U type;
};

并用作:

template <bool S>
class NuclearPowerplantControllerFactoryProviderFactory 
{
  typedef typename select<S, int, unsigned int>::type data_t;
  //use data_t as data type
};

如果S为真,则选择select中的第一个类型参数,否则将选择第二个类型参数。它是通用的,因为您在select<>中指定了两种类型,并且基于布尔值,select<b,T,U>::type返回第一种类型或第二种类型。