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