模板与bool参数

时间:2014-05-17 12:33:03

标签: c++ templates boolean

我需要用bool参数实现模板。 如果bool = true,我们需要使用list conteiner,否则我们需要使用vector conteiner。

template <bool isList>

我该怎么做?

2 个答案:

答案 0 :(得分:29)

使用std::conditionaltemplate specialization

我。结构/类

template <bool isList>
struct A
{
    typename std::conditional<isList, 
                              std::list<int>,
                              std::vector<int>>::type container;
};

或者,您可以专门为bool参数

设置模板
template <bool isList>
struct A;

template<>
struct A<true>
{
    std::list<int> container;
};

template<>
struct A<false>
{
    std::vector<int> container;
};

然后

A<true>  a1; // container of a1 is a list
A<false> a2; // container of a2 is a vector

II。模板功能

如果您需要模板功能类型,那么您可以像下面这样做。它根据entry参数返回一个容器。

template <bool isList>
auto func() -> typename std::conditional<isList, 
                                         std::list<int>,
                                         std::vector<int>>::type
{
    typename std::result_of<decltype(func<isList>)&()>::type result;

    // ...

    return result;
};

然后

auto f1 = func<true>();  // f1 is a list
auto f2 = func<false>(); // f2 is a vector

答案 1 :(得分:1)

从c ++ 17开始,有一些更简洁的选择。

类/结构

对于类,我建议您做的与masoud对std::conditional的回答不同的唯一事情是使用using声明,而不是在声明成员变量时直接使用类型。这样,可以重复使用类型,并且typename是多余的。另外,std::conditional_t较短。

示例:

template<bool isList, typename _Type>
struct TemplatedStruct
{
    using _Container = std::conditional_t<isList, std::list<_Type>, std::vector<_Type>>;
    _Container container;
};

功能

  1. 使用具有if constexpr语法的模板化函数以及auto返回类型推导。示例:
template<bool isList, typename _Type>
auto createContainer()
{
    if constexpr (isList)
    {
        return std::list<_Type>{};
    }
    else
    {
        return std::vector<_Type>{};
    }
}
  1. 使用std::conditional就像在马苏德的答案中一样,但要更清洁。 要么:
template<
    bool isList, typename _Type, 
    typename _Container = std::conditional_t<isList, std::list<_Type>, std::vector<_Type>>
>
auto createContainer() -> _Container
{
    _Container result;
    // Do stuff that works with both containers I guess
    return result;
}

或者:

template<bool isList, typename _Type>
auto createContainer()
{
    using _Container = std::conditional_t<isList, std::list<_Type>, std::vector<_Type>>;
    _Container result;
    // Do stuff that works with both containers I guess
    return result;
}

我删除了

#include <list>
#include <vector>

为简单起见,来自我的示例。