Информация об изменениях

Сообщение Re[3]: Создать новый std::tuple из подмножества имеющегося от 22.02.2023 12:46

Изменено 22.02.2023 12:52 rg45

Re[3]: Создать новый std::tuple из подмножества имеющегося
Здравствуйте, 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), то она будет выигрывать подстановку при использовании для неконстантных объектов и prvalue выражений.

Чтоб диагностировать точно, желательно видеть минимальный пример, воспроиводящий проблему.
Re[3]: Создать новый std::tuple из подмножества имеющегося
Здравствуйте, 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 выражений (неконстантных объектов, проще говоря), использованных для задания фактических параметров.

Чтоб диагностировать точно, желательно видеть минимальный пример, воспроиводящий проблему.