如果 enable_if 确定 T 是容器,则启用结构?
Enable a struct if enable_if determines that T is a container?
我正在尝试构建一个模板化结构,它只会为 T
使用容器。我发现 this post 显示了如何确定传入的值是否为容器。所以我决定继续尝试将它用于我的程序,因为我不希望用户创建整数、浮点数或双精度数的结构。
这是我写的代码:
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
}
我怎样才能做到这一点?
Which leads me to believe that I am doing something wrong with std::enable_if
or I am missing something rather simple.
完全正确。
您忘记了一个::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;
};
我正在尝试构建一个模板化结构,它只会为 T
使用容器。我发现 this post 显示了如何确定传入的值是否为容器。所以我决定继续尝试将它用于我的程序,因为我不希望用户创建整数、浮点数或双精度数的结构。
这是我写的代码:
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
}
我怎样才能做到这一点?
Which leads me to believe that I am doing something wrong with
std::enable_if
or I am missing something rather simple.
完全正确。
您忘记了一个::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;
};