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

时间:2019-08-04 18:26:05

标签: c++ c++11 c++14 c++17

我有以下功能模板

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的默认值?据我了解,尤其是this answer,我应该能够做到

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

但是当我这样做时,我的模板似乎从未启用。

1 个答案:

答案 0 :(得分:2)

如果enable_if通过,则第一个代码段将产生:

template<int = 0>

哪个有效。

但是,这就是您从片段2中得到的结果:

template<void>

不是,所以SFINAE总​​是在这里参加。