Wrapper for functional object to change argument and return value types
От: fk0 Россия https://fk0.name
Дата: 10.05.18 12:33
Оценка:
Hемедленно нажми на RESET, All!

Я хочу написать класс-обёртку (в примере ниже это AnyFunction), который принимает ссылки или указатели на функции, или функциональные объекты (и конкретно лямбда-функции) в конструкторе и сохраняет их по значению внутри класса (как std::function, например). Далее класс может быть сам использзован как функциональный объект и является обёрткой над внутренним функциональным объектом, т.е. вызывает его из operator(), но при этом выполняются следующие условия:

1. Тип возвращаемого значения для класса-обёртки (AnyFunction) всегда предопределён и определяется, в частности, параметром шаблона класса AnyFunction, и это может быть в том числе void.

2. Но внутренний функтор (переданный в конструктор AnyFunction) может не возвращать никакого значения (void) -- в таком случае будет подставлено некое значение по-умолчанию переданное в конструктор AnyFunction ил параметром шаблона (последний вариант неудачен, хотя и удобен...)

3. Класс-обёртка всегда принимает аргументы заданные в параметрах шаблона AnyFunction (ArgType...) Но внутренний функтор может не принимать никаких аргументов -- тогда аргументы игнорируются, иначе передаются во внутренний функтор.

Нужно ограничиться C++11. Как это сделать?

Я уже задавал вопрос на stackoverflow (https://stackoverflow.com/questions/50163039/wrapper-for-functional-object-to-change-argument-and-return-value-types) и решил самостоятельно (http://coliru.stacked-crooked.com/a/628b8971466fa74d), но рад был бы узнать, можно ли это сделать проще и лучше. В нормальных языках (perl, python, tcl...) такая задача ничего не стоит и решается тривиально. Но сколько сложностей в C++...
c++ c++11 functor std::function
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.