我需要用bool参数实现模板。 如果bool = true,我们需要使用list conteiner,否则我们需要使用vector conteiner。
template <bool isList>
我该怎么做?
答案 0 :(得分:29)
使用std::conditional
或template 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
如果您需要模板功能类型,那么您可以像下面这样做。它根据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;
};
if constexpr
语法的模板化函数以及auto
返回类型推导。示例:template<bool isList, typename _Type>
auto createContainer()
{
if constexpr (isList)
{
return std::list<_Type>{};
}
else
{
return std::vector<_Type>{};
}
}
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>
为简单起见,来自我的示例。