为什么std :: enable_if需要第二个模板类型

Why does std::enable_if require the second template type?

本文关键字:第二个 类型 if std enable 为什么      更新时间:2023-10-16

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总是在这里启动。

相关文章: