170 похожих чатов

Привет :) Пишу свою реализацию std::function. Скажите, что я делаю

не так? Он не хочет принимать лямбды =(

> func.hpp
template<typename RT, typename ...ARGS>
class func : public obj {
using function_pointer = RT(*)(ARGS...);
std::unique_ptr<function_pointer> m_function_pointer;
public:
func(function_pointer function_pointer);
RT operator()(ARGS... args);
};

> func.cpp
template<typename RT, typename ...ARGS>
func<RT, ARGS...>::func(func<RT, ARGS...>::function_pointer function_pointer) {
m_function_pointer.reset(function_pointer);
}

template<typename RT, typename ...ARGS>
RT func<RT, ARGS...>::operator()(ARGS ...args) {
return m_function_pointer(args...);
}

> main.cpp
func<int(int)> triple = [](int value) -> int {
return value * 3;
};

int six = triple(2);

32 ответов

20 просмотров

Что это и зачем? std::unique_ptr<function_pointer> m_function_pointer;

1. Не нужно класть в unique_ptr то, что не было выделено через new (или что-либо, соответствующее заданному deleter'у) 2. Не нужно выносить реализацию шаблонов в .cpp 3. func<int(int)> - это RT = int(int), Args... = {empty-pack}

А что за obj?

Alexander Karaev
1. Не нужно класть в unique_ptr то, что не было вы...

О, точно, про 3 я как-то не подумал, ха-ха

Слава
А что за obj?

Ничего особенного - просто base-класс для всех классов моего проекта

Alexander Karaev
1. Не нужно класть в unique_ptr то, что не было вы...

Можете, пожалуйста, подробнее про второе?

Анатолий Фролов (anafro)
Можете, пожалуйста, подробнее про второе?

Можно. Тело шаблонов должно быть видно из точки инстанцирования, поэтому его нельзя выносить в .cpp (в общем случае). Всё вернуть в .hpp

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

вы знаете в теории хотя бы, как std::function устроен?

Анатолий Фролов (anafro)
Почему?

template<typename RT, typename ...ARGS> using func = RT(*)(ARGS...); Вся ваша реализация если не брать в учет наследоавние

Denis P
https://habr.com/en/post/159389/

Спасибо большое)

Анатолий Фролов (anafro)
Чем чреват код шаблонов в сурсах?

> Тело шаблонов должно быть видно из точки инстанцирования, поэтому его нельзя выносить в .cpp (в общем случае). Должно == иначе не слинкуется

Слава
template<typename RT, typename ...ARGS> using func...

Отсутствие наследование не так критично) Надо будет протестировать, работает ли это со всеми видами функций

Слава
А с какими не будет?

с лямбдами со стейтом?

Denis P
с лямбдами со стейтом?

Но это же не функция, а функтор..

Denis P
ну и что, это callable

Но не функция же) Можно сейчас начать как ты душить с динамическим массивом и его определением в стандарте

Ilya Zviagin
Это тоже не нужно.

Это никак не влияет

Denis P
мы вроде про аналог std::function говорим

Ну ты написал, что не со всем ФУНКЦИЯМИ работает

Слава
Ну ты написал, что не со всем ФУНКЦИЯМИ работает

ну это как раз про докопаться до слов видимо, хотя вроде было понятно о чем речь

Denis P
ну это как раз про докопаться до слов видимо, хотя...

Именно так. По заветам супапро докапываться до слов

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта