我有以下功能模板
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 });
}
但是当我这样做时,我的模板似乎从未启用。
答案 0 :(得分:2)
如果enable_if
通过,则第一个代码段将产生:
template<int = 0>
哪个有效。
但是,这就是您从片段2中得到的结果:
template<void>
不是,所以SFINAE总是在这里参加。