Opened 4 years ago

Closed 4 years ago

#270 closed ожидается проверка (задача сдана)

Д/З №4. function

Reported by: malyutin.danila Owned by: rutsky,grabovoy.philipp
Priority: проверка Milestone: ha4-milestone2
Component: HA#4 function Version:
Keywords: Cc:

Description


Change History (8)

comment:1 Changed 4 years ago by malyutin.danila

Ждём автотестов.

Last edited 4 years ago by malyutin.danila (previous) (diff)

comment:2 Changed 4 years ago by cpptester

Type: ожидается проверкаожидаются исправления

Tested revision 589 by malyutin.danila.

Main tests

test

stage

result

info

log

comp_include_guard.cpp

FAILURE

comp_include_guard-gcc62.log

Common header used in some tests: common.h

comment:3 Changed 4 years ago by cpptester

Tested revision 624 by malyutin.danila.

All tests passed. Good job!

comment:4 Changed 4 years ago by malyutin.danila

Type: ожидаются исправленияожидается проверка

comment:5 Changed 4 years ago by Vladimir Rutsky

Milestone: ha4-milestone1ha4-milestone2
Type: ожидается проверкаожидаются исправления

Замечания:

  1. Наследуйтесь от std::exception публично:
class bad_function_call : public std::exception
{
};
  1. В шаблонном конструкторе SFINAE лучше реализовать через шаблонный аргумент со значением по умолчанию (он точно будет оптимизирован, а вот дополнительный аргумент, пусть и со значением по умолчанию, не обязательно):
 template <typename F, typename = typename std::enable_if_t<std::is_convertible<F, FuncType>::value>>
 function(F f)
     : call_(f), target_(nullptr)
 {
 }
  1. Можно обойтись без SFINAE для разбора случая, когда function конструируется от сырой функции и от функтора, сделав один нешаблонный конструктор от сырой функции, и один шаблонный конструктор, который будет принимать функтор.
  1. В следующих двух operator= не должно быть необходимости --- соответствующие конструкторы implicit, и при попытке присводить в function, например, nullptr, должен вызваться соответствующий конструктор и operator=(function &&):

Они явно указаны в интерфейсе std::function, можно оставить.

function &operator=(std::nullptr_t)
    {
        call_ = nullptr;
        target_.reset();
        return *this;
    }

    template <typename F>
    function &operator=(F &&f)
    {
        function(std::forward<F>(f)).swap(*this);
        return *this;
    }
Last edited 4 years ago by Vladimir Rutsky (previous) (diff)

comment:6 Changed 4 years ago by cpptester

Tested revision 712 by malyutin.danila.

All tests passed. Good job!

comment:7 Changed 4 years ago by malyutin.danila

Type: ожидаются исправленияожидается проверка
  1. Исправил
  2. Исправил
  3. Я хотел, чтобы ещё лямбды, которые к указателю на функцию приводятся, эффективно хранились.

comment:8 in reply to:  7 Changed 4 years ago by Vladimir Rutsky

Resolution: задача сдана
Status: newclosed

Replying to malyutin.danila:

  1. Я хотел, чтобы ещё лямбды, которые к указателю на функцию приводятся, эффективно хранились.

Да, это хороший use case, я про него забыл.

Решение зачтено.

Note: See TracTickets for help on using tickets.