Можете ли вы использовать std :: bind (или что-то еще), чтобы изменить тип возвращаемого значения? - PullRequest
0 голосов
/ 30 января 2019

Скажем, у меня есть функция,

bool my_func(bool input_val) { return !input_val; }

, и я хочу передать ее как функцию, которая возвращает void и ничего не берет, поэтому это будет что-то вроде:

bool the_truth = true;
void func_taking_a_void_func(std::function<void()> void_func) {};
func_taking_a_void_func([the_truth]() -> void { my_func(the_truth); });

Сначала я попытался использовать std::bind, но, естественно, компилятор не смог использовать my_func, поскольку он возвращал bool вместо void.

func_taking_a_void_func(std::bind(my_func, the_truth));

Возможно ли сделать что-то вроде std::bind_and_ignore_return_type без просто обернуть вызов функции лямбда-выражением?Я использую C ++ 11 на VS2013, но все остальное тоже хорошо.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Непонятно, в чем ваша проблема, но в любом случае лямбда не использует.

#include<type_traits>

template<class F>
struct adapt{
    bool arg_;
    F f_;
    adapt(bool arg, F f) : arg_{arg}, f_{f}{}
    void operator()() const{f_();}
};

template<class F> adapt<F> make_adapt(bool b, F f){return adapt<F>(b, f);}

template<class F> int func_taking_a_void_func(F&& f){
    static_assert(std::is_same<decltype(f()), void>{}, "!");
    return 5;
}

bool my_func(bool input_val) { return !input_val; }

int main(){
    bool the_truth = true;
    func_taking_a_void_func(make_adapt(the_truth, my_func));
}
0 голосов
/ 30 января 2019

Ну, аргумент bool input_val должен исходить из где-то .

Если у вас действительно только один флаг, вы можете просто сделать две функции

void my_true_func() { my_func(true); }
void my_false_func() { my_func(false); }

И выберите один или другой в зависимости от флага.

В противном случае bool input_val должна быть глобальной / локальной переменной потока, доступной из любого места.

Вы не можете использовать лямбда-захват, делая этопревратит лямбду из функции в структуру.Но если приведенные выше решения не помогают, единственный способ - это работать с функторами вместо указателей на функции.

Обратите внимание, что std::bind не может ничего захватывать и в значительной степени устарел с момента появления лямбд.

0 голосов
/ 30 января 2019

Вы не можете использовать std::bind или лямбду, которая захватывает переменную, чтобы передать ее функции, которая ожидает указатель на функцию.Лямбды могут быть преобразованы в указатели на функции, когда они не захватывают какую-либо переменную;результат std::bind никогда не будет.

...