Здравствуйте, SaZ, Вы писали:
SaZ>Спасибо, то что надо, но я никак не могу осилить enable_if:
SaZ>SaZ>// template <typename T, std::enable_if_t<std::is_convertible_v<T*, my_base *>, bool> = true>
SaZ>// template <typename T, typename = std::enable_if_t<std::is_base_of_v<my_base, T>, bool>>
SaZ>template <typename T, std::enable_if_t<std::is_base_of_v<my_base, T>, bool> = true>
SaZ>auto my_filter(const T& v)
SaZ>{
SaZ> return std::make_tuple(v);
SaZ>}
SaZ>
SaZ>Эта перегрузка никогда не вызывается. Хотя пробовал static_assert вне этой функции — всё ок.
Сама по себе функция написана правильно. Не вызываться она может по разным причинам:
Возможно, эта функция определена не в том пространстве имен, в котором нужно, и не находится при ADL;
Возможно, существуют какие-то другие одноименные перегрузки, которые выигрывают overload resolution. Например, если в этой же области видимости определена перегрузка my_filter(T&& v), то она будет выигрывать подстановку для rvalue и неконстантных lvalue выражений (неконстантных объектов, проще говоря), использованных в качестве фактических параметров.
Могут быть и другие варианты. Чтоб диагностировать точно, желательно видеть минимальный пример, воспроиводящий проблему.