не так? Он не хочет принимать лямбды =(
> 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);
Что это и зачем? 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?
О, точно, про 3 я как-то не подумал, ха-ха
Ничего особенного - просто base-класс для всех классов моего проекта
Можете, пожалуйста, подробнее про второе?
Можно. Тело шаблонов должно быть видно из точки инстанцирования, поэтому его нельзя выносить в .cpp (в общем случае). Всё вернуть в .hpp
Не очень понятен смысл в этой обертке. Если она ничего больше чем указатель на функцию не делает
вы знаете в теории хотя бы, как std::function устроен?
Я и хочу понять
https://habr.com/en/post/159389/
template<typename RT, typename ...ARGS> using func = RT(*)(ARGS...); Вся ваша реализация если не брать в учет наследоавние
Чем чреват код шаблонов в сурсах?
Спасибо большое)
> Тело шаблонов должно быть видно из точки инстанцирования, поэтому его нельзя выносить в .cpp (в общем случае). Должно == иначе не слинкуется
Отсутствие наследование не так критично) Надо будет протестировать, работает ли это со всеми видами функций
Хорошо) Спасибо за объяснения :Р
я вам сразу скажу что не будет
А с какими не будет?
с лямбдами со стейтом?
Аааа, ахаха
Но это же не функция, а функтор..
ну и что, это callable
Но не функция же) Можно сейчас начать как ты душить с динамическим массивом и его определением в стандарте
мы вроде про аналог std::function говорим
Это никак не влияет
Ну ты написал, что не со всем ФУНКЦИЯМИ работает
ну это как раз про докопаться до слов видимо, хотя вроде было понятно о чем речь
Ну если про все callable, то да
Именно так. По заветам супапро докапываться до слов
Обсуждают сегодня