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

Сообщение Re[5]: Вывод типа шаблонного параметра функции от 19.03.2020 10:17

Изменено 19.03.2020 10:17 andyp

Re[5]: Вывод типа шаблонного параметра функции
Здравствуйте, sergii.p, Вы писали:

SP>так ему надо передать принимаемые типы (а у нас их нет). Просто сказать ему, что нужен абы какой оператор(), который возвращает bool, не получиться.


есть идея использовать class template argument deduction для std::function как-то так

#include <iostream>
#include <type_traits>
#include <functional>

template<typename Pred>
using ret_ftn_type =  typename decltype(std::function{std::declval<Pred>()})::result_type;

template<typename Pred>
bool is_bool_ret_v = std::is_same_v<ret_ftn_type<Pred>, bool>;

template<typename Pred, typename Enabler = void>
struct is_predicate : std::false_type {};

template<typename Pred>
struct is_predicate<Pred, typename std::enable_if_t<is_bool_ret_v<Pred>>> : std::true_type {};

auto predicate = [](int v){return true;};
auto not_a_predicate = [](int v){return 10;};


int main() 
{
ret_ftn_type<decltype(predicate)> s(1.0);

std::cout << (int)(is_predicate<decltype(predicate)>::value) << std::endl;
std::cout << (int)(is_predicate<decltype(not_a_predicate)>::value) << std::endl;

}


Но что-то не работает. Где-то косячу
Re[5]: Вывод типа шаблонного параметра функции
Здравствуйте, sergii.p, Вы писали:

SP>так ему надо передать принимаемые типы (а у нас их нет). Просто сказать ему, что нужен абы какой оператор(), который возвращает bool, не получиться.


есть идея использовать class template argument deduction для std::function как-то так

#include <iostream>
#include <type_traits>
#include <functional>

template<typename Pred>
using ret_ftn_type =  typename decltype(std::function{std::declval<Pred>()})::result_type;

template<typename Pred>
bool is_bool_ret_v = std::is_same_v<ret_ftn_type<Pred>, bool>;

template<typename Pred, typename Enabler = void>
struct is_predicate : std::false_type {};

template<typename Pred>
struct is_predicate<Pred, typename std::enable_if_t<is_bool_ret_v<Pred>>> : std::true_type {};

auto predicate = [](int v){return true;};
auto not_a_predicate = [](int v){return 10;};


int main() 
{

std::cout << (int)(is_predicate<decltype(predicate)>::value) << std::endl;
std::cout << (int)(is_predicate<decltype(not_a_predicate)>::value) << std::endl;

}


Но что-то не работает. Где-то косячу