Question: How do I accomplish the following in C++, and what is doing such things called?

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

```

Answer: 
By **specialization**:

```
template <bool> class Foo;

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

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

```

You can choose to make one of the two cases the primary template and the other one the specialization, but I prefer this more symmetric version, given that `bool` can only have two values.

---

If this is the first time you see this, you might also like to think about *partial* specialization:

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

```

---

As @Nawaz says, the easiest way is probably to `#include <type_traits>` and say:

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

```
@Kerrek has answered the question sufficiently, but that can be more generic as follows:

```
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;
};

```

And use as:

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

```

If `S` is true, the first type argument in `select` will be selected, or else second type argument will be selected. It is generic because you specify both types in `select<>`, and based on the value of the boolean, `select<b,T,U>::type` returns either first type, or second type.