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

cbeh67ev  于 2023-05-24  发布在  其他
关注(0)|答案(3)|浏览(233)

我如何在C++中完成以下操作,以及做这样的事情被称为什么?

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

dced5bon1#

专业化

template <bool> class Foo;

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

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

您可以选择将这两种情况中的一种作为主模板,另一种作为特殊化模板,但我更喜欢这种更对称的版本,因为bool只能有两个值。
如果这是你第一次看到这一点,你可能还想考虑一下 partial specialization:

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;
w7t8yxp5

w7t8yxp52#

@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为true,则选择select中的第一个类型参数,否则选择第二个类型参数。它是通用的,因为您在select<>中指定了两种类型,并且根据布尔值,select<b,T,U>::type返回第一种类型或第二种类型。

dgtucam1

dgtucam13#

从C++14开始,它可以并且应该使用std::conditional<>来完成,参见https://en.cppreference.com/w/cpp/types/conditional
[在引擎盖下,它与@Nawaz建议的解决方案相同,但只要可用,标准解决方案总是首选]

相关问题