我如何在C++中完成以下任务,以及这样做的事情是什么?
template <bool S>
class NuclearPowerplantControllerFactoryProviderFactory {
// if S == true
typedef int data_t;
// if S == false
typedef unsigned int data_t;
};
Run Code Online (Sandbox Code Playgroud)
Ker*_* SB 17
通过专业化:
template <bool> class Foo;
template <> class Foo<true>
{
typedef int data_t;
};
template <> class Foo<false>
{
typedef unsigned int data_t;
};
Run Code Online (Sandbox Code Playgroud)
您可以选择将两种情况中的一种作为主要模板,另一种作为特殊化,但我更喜欢这种更对称的版本,因为它bool只能有两个值.
如果这是您第一次看到这个,您可能还想考虑部分专业化:
template <typename T> struct remove_pointer { typedef T type; };
template <typename U> struct remove_pointer<U*> { typedef U type; };
Run Code Online (Sandbox Code Playgroud)
正如@Nawaz所说,最简单的方法可能是#include <type_traits>:
typedef typename std::conditional<S, int, unsigned int>::type data_t;
Run Code Online (Sandbox Code Playgroud)
@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;
};
Run Code Online (Sandbox Code Playgroud)
用作:
template <bool S>
class NuclearPowerplantControllerFactoryProviderFactory
{
typedef typename select<S, int, unsigned int>::type data_t;
//use data_t as data type
};
Run Code Online (Sandbox Code Playgroud)
如果S为true,select将选择第一个类型参数,否则将选择第二个类型参数.它是通用的,因为您指定了两种类型select<>,并且基于布尔值,select<b,T,U>::type返回第一种类型或第二种类型.
| 归档时间: |
|
| 查看次数: |
12834 次 |
| 最近记录: |