Почему я не могу передать функцию-член в качестве параметра (но может передавать лямбда той же функции) [duplicate]

Я удивлен, что никто не упоминает регулярное выражение, потому что иногда строка должна быть подготовлена ​​и нормализована до того, как будет использована функция

import re
def parseNumber(value, as_int=False):
    try:
        number = float(re.sub('[^.\-\d]', '', value))
        if as_int:
            return int(number + 0.5)
        else:
            return number
    except ValueError:
        return float('nan')  # or None if you wish

:

parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999\n')
> 99999.0

и, кстати, что-то убедитесь, что у вас есть номер:

import numbers
def is_number(value):
    return isinstance(value, numbers.Number)
    # will work with int, float, long, Decimal
2
задан Praetorian 30 May 2014 в 20:37
поделиться

2 ответа

print_add является нестатической функцией-членом из foo, что означает, что она должна быть вызвана в экземпляре Foo; поэтому он имеет неявный первый аргумент, указатель this.

Используйте lambda, который захватывает экземпляр foo и вызывает print_add на нем.

Foo foo;
test([&foo](int i){ foo.print_add(i); });

Другой опция должна использовать std::bind для привязки экземпляра foo:

test(std::bind(&Foo::print_add, &foo, std::placeholders::_1));

Живая демонстрация

9
ответ дан Praetorian 24 August 2018 в 09:17
поделиться

ПРОБЛЕМА

Вы не можете напрямую привязать указатель на функцию -функции-функции , принадлежащий типу Foo к std::function<void(int)>, в частности, потому что вызов нестатического члена -функция требует экземпляра типа Foo.

Foo obj; obj.member_function (); // can't call `member_function` without `obj`

Примечание. Однако вы можете привязать &Foo::print_add к std::function<void(Foo&, int)> x; и называть его как x(instance_of_Foo, arg);.

Примечание. Также возможно привязать его к std::function<void(Foo*, int>, для чего потребуется Foo* вместо lvalue типа Foo.



РЕШЕНИЕ

Вместо этого вы можете использовать std::bind - bind экземпляр Foo для рассматриваемой функции-члена, например, в ниже пример:

int main(){
    Foo foo;
    test (std::bind (&Foo::print_add, foo, std::placeholders::_1));
    return 0;
}

Выше мы привязываем экземпляр Foo с именем foo к указателю функции-функции &Foo::print_add.


Использование std::placeholders::_1 сообщает std::bind, что мы хотели бы, чтобы он сгенерировал функциональный объект , который можно вызвать, используя один (1) аргумент.

С в приведенном выше фрагменте вы будете иметь поведение, о котором вы сейчас просите; my_func(5) будет эквивалентным вызову foo.print_add (5).


ДОКУМЕНТАЦИЯ

3
ответ дан Filip Roséen - refp 24 August 2018 в 09:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: