Шаблоны C ++: выберите другой тип в зависимости от значения параметра шаблона. - PullRequest
12 голосов
/ 23 ноября 2011

Как мне выполнить следующее в C ++ и как это называется?

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

Ответы [ 2 ]

16 голосов
/ 23 ноября 2011

По специализация :

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;
6 голосов
/ 23 ноября 2011

@ Керрек достаточно ответил на вопрос, но это может быть более общим следующим образом:

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 равно true, будет выбран первый аргумент типа в select, или же будет выбран аргумент второго типа. Он является общим, потому что вы указываете оба типа в select<>, и, основываясь на значении логического значения, select<b,T,U>::type возвращает либо первый тип, либо второй тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...