如何在C ++中完成以下任务,以及正在做什么呢?
template <bool S>
class NuclearPowerplantControllerFactoryProviderFactory {
// if S == true
typedef int data_t;
// if S == false
typedef unsigned int data_t;
};
答案 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
返回第一种类型或第二种类型。