为什么std :: enable_if需要第二个模板类型
Why does std::enable_if require the second template type?
i具有以下功能模板
template
<
typename FilterLHS,
typename FilterRHS,
typename Of = typename FilterLHS::OfType,
std::enable_if_t<std::is_base_of_v<Filter<Of>, FilterLHS> && std::is_base_of_v<Filter<Of>, FilterRHS>, int> = 0
>
std::shared_ptr<OrFilter<Of>> operator ||(const std::shared_ptr<FilterLHS> &lhs, const std::shared_ptr<FilterRHS> &rhs)
{
return std::make_shared<OrFilter<Of>>(OrFilter<Of>{ lhs, rhs });
}
它可以正常工作。我的问题是,为什么需要int
第二参数和enable_if
的默认值?据我了解,尤其是从这个答案中,我应该能够做
template
<
typename FilterLHS,
typename FilterRHS,
typename Of = typename FilterLHS::OfType,
std::enable_if_t<std::is_base_of_v<Filter<Of>, FilterLHS> && std::is_base_of_v<Filter<Of>, FilterRHS>>
>
std::shared_ptr<OrFilter<Of>> operator ||(const std::shared_ptr<FilterLHS> &lhs, const std::shared_ptr<FilterRHS> &rhs)
{
return std::make_shared<OrFilter<Of>>(OrFilter<Of>{ lhs, rhs });
}
但是当我这样做时,我的模板似乎从未启用。
如果enable_if
会通过,则第一个片段将产生:
template<int = 0>
有效。
但这是您从摘要2获得的。
template<void>
不是,所以sfinae总是在这里启动。
相关文章:
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 等待整个 omp 块完成,然后再调用第二个函数
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何从第一个参数推断第二个参数类型?
- 为什么std :: enable_if需要第二个模板类型
- C 功能模板指定第二个模板参数类型
- 从第一类型的第二个非类型参数中推断出第一类
- 返回函数模板的类型C++作为第二个模板参数
- 在此示例中,基本模板类如何确定第二个混凝土类型
- 两种类型的定义构造函数有什么区别?第一个使用":",第二个用大括号(如函数)定义它
- 如何查找一组类型对是否包含一个元素作为第二个成员
- 对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
- 如何将 char 类型数组传递给函数并将第一个字符数组复制到第二个图表数组并使用 c++ 进行比较
- 在 c++ 中给出两个整数向量(大小和类型相同),我想从最小到最大元素对一个进行排序,并更改第二个向量的顺序
- C++11 获取第一个(第二个等)参数的类型,类似于result_of
- 递归可变参数模板函数调用第二个参数类型的指针"loses"指针
- 为什么在条件运算符(?:)中,第二个和第三个操作数必须具有相同的类型
- 第二个指定的类型在模板typename声明中意味着什么