如果enable_if确定 T 是容器,则启用结构
Enable a struct if enable_if determines that T is a container?
我正在尝试构建一个模板化结构,该结构只会为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;
};
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 编译时未启用intel oneApi CUDA支持
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 如果enable_if确定 T 是容器,则启用结构
- 序列化结构以归档,并用字符串再次对其进行启用
- 使用模板检查结构体中的字段,启用函数if,并在失败时给出一个漂亮的错误消息