如果enable_if确定 T 是容器,则启用结构

Enable a struct if enable_if determines that T is a container?

本文关键字:启用 结构 enable if 确定 如果      更新时间:2023-10-16

我正在尝试构建一个模板化结构,该结构只会为T容器。我找到了这篇文章,展示了如何确定传入的值是否是容器。所以我决定继续尝试在我的程序中使用它,因为我不希望用户创建整数、浮点数或双精度的结构。

这是我编写的代码:

template<typename T> 
struct is_container : std::integral_constant<bool, has_const_iterator<T>::value && has_begin_end<T>::beg_value && has_begin_end<T>::end_value> { };
template<typename T, typename Enable = void>
struct Cont;
template <typename T>
struct Cont<T, typename std::enable_if<is_container<T>::value>>
{
  Cont(const std::string &n) : name(n) {}
  std::string name;
};

但是,当我尝试写入 main 时:

int main()
{
  Cont<std::vector<int>> myContainer("Vector");
}

我收到一个编译器错误:Cont<std::vector<int> > myContainer has initializer but incomplete type.我有点卡在了这个去哪里,因为如果我从模板参数中删除std::enable_if,它可以很好地编译。这让我相信我在std::enable_if上做错了什么,或者我错过了一些相当简单的东西。

我试图实现以下目标:

int main()
{
  Cont<std::vector<int>> myContainer("Vector"); //happily compiles
  Cont<int> badContainer("Bad"); // will not compile
}

我怎样才能做到这一点?

这让我相信我在std::enable_if做错了什么,或者我错过了一些相当简单的东西。

完全。

你忘记了::type

template <typename T>  // add this ---------------------------vvvvvv
struct Cont<T, typename std::enable_if<is_container<T>::value>::type>
{
  Cont(const std::string &n) : name(n) {}
  std::string name;
};

从 C++14 开始,您还可以使用 std::enable_if_t(因此您可以删除::type和前面的typename(

template <typename T>
struct Cont<T, std::enable_if_t<is_container<T>::value>>
{
  Cont(const std::string &n) : name(n) {}
  std::string name;
};