Size: a a a

2020 October 26

O

Ofee in pro.cxx
Kirill
template <typename T, typename F>
bool foo (const T & x, const F & a, const F & b)
{
   return a (x) == b (x);
}

template <typename T>
bool bar (const T & x, const T & a, const T & b)
{
   return foo (
       x,
       [&] (const T & arg) {return a == arg;},
       [&] (const T & arg) {return b == arg;});
}

int main ()
{
   bar (0, 0, 0);
}


Почему дедукция ломается? Выдаёт вот такую ошибку
no matching function for call to ‘foo(const int&, bar(const T&, const T&, const T&) [with T = int]::<lambda(const int&)>, bar(const T&, const T&, const T&) [with T = int]::<lambda(const int&)>)’

deduced conflicting types for parameter ‘const F’ (‘bar(const T&, const T&, const T&) [with T = int]::<lambda(const int&)>’ and ‘bar(const T&, const T&, const T&) [with T = int]::<lambda(const int&)>’)


Помогает добавить третий параметр в foo, например вот так template <typename T, typename F1, typename F2>

Но должно ведь работать и с одним, разве нет???
Тип каждой лямбды уникален, вы не можете принять две разных лямбды по одному типу
источник

K

Kirill in pro.cxx
А можно ли в Compile-time проверить, чтобы сигнатуры совпадали?
источник

АР

Андрей Руссков... in pro.cxx
сигнатуры чего? )
источник

K

Kirill in pro.cxx
Ну лямбд
источник

АР

Андрей Руссков... in pro.cxx
у абстрактного класса может быть много перегрузок operator()
источник

АР

Андрей Руссков... in pro.cxx
и надо как-то понять что у одной из перегрузок T::operator() такая-то сигнатура
источник

АР

Андрей Руссков... in pro.cxx
короче в общем виде такую задачу решить тяжеловато
источник

OZ

Olzhas Zhumabek in pro.cxx
Kirill
А можно ли в Compile-time проверить, чтобы сигнатуры совпадали?
сигнатуру которую ты знаешь - да. Сигнатуры которые ты не знаешь - нет
источник

АР

Андрей Руссков... in pro.cxx
можно решить задачу "T имеет такой T::operator(), что он принимает T& и возвращает U"
источник

K

Kirill in pro.cxx
Понял в какую сторону копать, спасибо
источник

AF

Andrew Fa in pro.cxx
гайс, всем привет, а что может с visual studio blend помочь?
источник

AP

Alexander Potapov in pro.cxx
Olzhas Zhumabek
сигнатуру которую ты знаешь - да. Сигнатуры которые ты не знаешь - нет
если лямбды не шаблонные (т.е. без auto в аргументах), то можно преобразовать в std::function и сравнить их типы
источник

ПК

Побитый Кирпич... in pro.cxx
Kirill
А можно ли в Compile-time проверить, чтобы сигнатуры совпадали?
можно
источник

ПК

Побитый Кирпич... in pro.cxx
Alexander Potapov
если лямбды не шаблонные (т.е. без auto в аргументах), то можно преобразовать в std::function и сравнить их типы
да достаточно просто разложить по частичной специализации &operator()
источник

АР

Андрей Руссков... in pro.cxx
Alexander Potapov
если лямбды не шаблонные (т.е. без auto в аргументах), то можно преобразовать в std::function и сравнить их типы
не надо делать type erasure там, где он не нужен
источник

AP

Alexander Potapov in pro.cxx
Побитый Кирпич
да достаточно просто разложить по частичной специализации &operator()
ну а так быстрее std::is_same_v<decltype(std::function{f}), decltype(std::function{g})>
источник

A

ALEXX in pro.cxx
Alexander Potapov
ну а так быстрее std::is_same_v<decltype(std::function{f}), decltype(std::function{g})>
А ведь интересная мысль... исходная задача довольно специфичная, но, кмк, это весьма элегантное решение.
источник

A

ALEXX in pro.cxx
Можно развить эту идею до чего-то типа is_convertible_to_something_same 😀
источник

АР

Андрей Руссков... in pro.cxx
почему нет то?
источник

АР

Андрей Руссков... in pro.cxx
тебе надо вычислить такие типы T и U, что foo(declval<T>()) -> U и bar(declval<T>()) -> U
источник