Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果Enable\u确定T是容器,则启用结构?_C++_C++11_Template Meta Programming_Sfinae_Enable If - Fatal编程技术网

C++ 如果Enable\u确定T是容器,则启用结构?

C++ 如果Enable\u确定T是容器,则启用结构?,c++,c++11,template-meta-programming,sfinae,enable-if,C++,C++11,Template Meta Programming,Sfinae,Enable If,我正在尝试构建一个模板结构,它只接受T的容器。我发现它展示了如何确定传入的值是否是容器。所以我决定继续并尝试在我的程序中使用它,因为我不希望用户创建一个整数、浮点或双精度的结构 以下是我编写的代码: template<typename T> struct is_container : std::integral_constant<bool, has_const_iterator<T>::value && has_begin_end<T>

我正在尝试构建一个模板结构,它只接受
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;
};
我怎样才能做到这一点

这让我相信我在
std::enable_上做错了什么,如果
或者我遗漏了一些非常简单的东西

没错

您忘记了一个
::键入

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

谢谢,我不知道最后我需要
键入
。但是,我决定使用
std::enable_if_t
选项,因为它看起来更干净。
int main()
{
  Cont<std::vector<int>> myContainer("Vector"); //happily compiles
  Cont<int> badContainer("Bad"); // will not compile
}
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;
};
template <typename T>
struct Cont<T, std::enable_if_t<is_container<T>::value>>
{
  Cont(const std::string &n) : name(n) {}
  std::string name;
};