Сообщение Re[3]: Создать новый std::tuple из подмножества имеющегося от 22.02.2023 12:46
Изменено 22.02.2023 12:53 rg45
Re[3]: Создать новый std::tuple из подмножества имеющегося
Здравствуйте, SaZ, Вы писали:
SaZ>Спасибо, то что надо, но я никак не могу осилить enable_if:
SaZ>
SaZ>Эта перегрузка никогда не вызывается. Хотя пробовал static_assert вне этой функции — всё ок.
Сама по себе функция написана правильно. Не вызываться она может по разным причинам:
Чтоб диагностировать точно, желательно видеть минимальный пример, воспроиводящий проблему.
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 выражений (неконстантных объектов, проще говоря), использованных для задания фактических параметров.
Чтоб диагностировать точно, желательно видеть минимальный пример, воспроиводящий проблему.
Re[3]: Создать новый std::tuple из подмножества имеющегося
Здравствуйте, SaZ, Вы писали:
SaZ>Спасибо, то что надо, но я никак не могу осилить enable_if:
SaZ>
SaZ>Эта перегрузка никогда не вызывается. Хотя пробовал static_assert вне этой функции — всё ок.
Сама по себе функция написана правильно. Не вызываться она может по разным причинам:
Чтоб диагностировать точно, желательно видеть минимальный пример, воспроиводящий проблему.
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 выражений (неконстантных объектов, проще говоря), использованных в качестве фактических параметров.
Чтоб диагностировать точно, желательно видеть минимальный пример, воспроиводящий проблему.