Отредактировано: я забыл, что обратный вызов захватывает указатель this
на outer
.
Я пытаюсь инициализировать некоторый класс и его член.
Класс не шаблонен.
Его элемент является шаблонным. Он принимает тип функции по шаблону для обратного вызова из инкапсулирующего класса. (Я не могу использовать std::function
, так как это срочный код.)
Кроме того, я хотел бы, чтобы компилятор определял тип шаблона для объекта обратного вызова (предоставленного члену).
код будет выглядеть примерно так (предположим, что весь шаблон существует):
template<typename func_t>
class inner : public inner_abstract_base
{
public:
func_t m_cb;
inner(func_t cb):m_cb(cb){}
};
class outer
{
Int member_fun(int);
public:
/*********first try****************/
// inner member{[this]{return this->member_fun(123);}}
/*********second try***************/
// inner member;
// outer():member([this]{return this->member_fun(321);})
// {}
/*********third try****************/
// auto lamb = [this]{return this->member_fun(987);};
//This or in the constructor initialization list
// inner<decltype(lamb)> member{lamb};
/*********fourth try***************/
// friend int func();
// inner<decltype(func)> member{func};
/*********fifth try***************/
// std::unique_ptr<inner_abstract_base> member_p;
// outer():member_p([]{return 666;})
// {}
/*********sixth try***************/
// inner<decltype(some_free_func)> member{some_free_func};
};
первая попытка
Я точно не знаю, почему это не работает. Я предполагаю, что в этом типе инициализации (в скобках в определении класса) компилятор не угадывает тип шаблона. Может быть, потому что он использует агрегатную инициализацию (правда?, и если да, то почему агрегатная инициализация не поддерживает вывод типа шаблона)
вторая попытка
Это не работает, потому что в определении аргумент шаблона не указан. Он вызывается только в конструкторе (во время выполнения), поэтому вывод типа шаблона невозможен.
третья попытка
нестатические члены не могут быть объявлены с помощью auto
(почему??) - поэтому член lamb
не может быть инициализирован в первую очередь.
четвертая попытка
Мне не нравится этот подход, так как он идет немного дальше оригинального дизайна, но, тем не менее, он не работает по какой-то причине, которую я не могу понять.
пятая попытка
Это выходит за рамки. Я думаю, что это не работает, потому что я не использую его правильно. Вероятно, потому что я не привел его к типу сына для распределения... (Как?). И, возможно, вывод типа не применяется к этому устройству с указателем даже при правильном использовании.
шестая попытка
Просто для удовольствия - бесплатное удовольствие! не работает по той же причине, по которой не работает функция друга (разумно).
Нижняя линия
Как вы можете решить это фиаско с/без захвата указателя this
?
Как вы можете позволить компилятору вывести типы переменных-членов?
Или более конкретно в данном случае?
* Прошу прощения за то, что перепутал с редактированием...
inner<decltype(&some_free_func)> member{&some_free_func};
- person Jarod42   schedule 09.11.2020outer():member_p(std::unique_ptr{new Inner{[]{return 666;}}}) {}
(CTAD используется дважды). - person Jarod42   schedule 09.11.2020