LINUX.ORG.RU

c++ и указатели на функцию


0

1

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

Как это можно сделать поэлегантнее?

★★★★★

std::function<прототип> или шаблонный параметр.

anonymous ()
Ответ на: комментарий от anonymous

Эта подстановка я так понимаю, на стадии компиляции происходит?

cvs-255 ★★★★★ ()

Но что-то подсказывает мне

скажи этому «что-то» в твоей голове, чтоб молчало, пока ты программируешь :)

Чем передача указателя на функцию некрасива?

Harald ★★★★★ ()
Ответ на: комментарий от cvs-255

Не очень понял, о чем ты. Два варианта:

void g(int x, std::functin<int(int)> f)
{
    f(x);
}

template<typename F>
void h(int x, F f)
{
    f(x);
}
В оба можно передавать любые соответствующие функции и объекты с operator(). В чем заключается твой вопрос?

anonymous ()
Ответ на: комментарий от Harald

В дальнейшем это может дать проблемы, например с портированием под opencl.

cvs-255 ★★★★★ ()
Ответ на: комментарий от anonymous

это будет на стадии компиляции подставляться.

cvs-255 ★★★★★ ()
Ответ на: комментарий от Harald

Потому что нельзя передать функциональный объект. Ваш К.О.

Begemoth ★★★★★ ()

Дожились

оно что так, что эдак в итоге выйдет обращение по указателю... Нахрена строить непонятные конструкции, когда можно просто передать указатель и вызвать его? Ну и нигде не передавать адреса в космос...

assembler_c ()
Ответ на: комментарий от cvs-255

В случае шаблона - да. std::function - полноценный объект и то, что он там вызывает хранится у него в потрохах. Там косвенное обращение присутствует. Хотя с -flto он вряд ли будет уступать шаблонному коду, если только не с динамической библиотекой работаете.

anonymous ()

Так лямбды есть, std::function, std::bind ...

Reset ★★★★★ ()
Ответ на: комментарий от cvs-255

В дальнейшем это может дать проблемы, например с портированием под opencl.

С портированием под OpenCL у std::function и подавно проблемы будут. Так что если нужен OpenCL, то придётся как то без передачи функции в функцию выворачиваться.

robus ★★★ ()

typedef?

#include<iostream>
#include <cmath>
typedef double (*func)(double);
double func1(func);
int main(){
    func f=sqrt;
    std::cerr<<func1(f);
    return 0;
}
double func1(func fa){
    return fa(4);
}

comp00 ★★★★ ()
Последнее исправление: comp00 (всего исправлений: 1)
Ответ на: комментарий от comp00

Плюсую. Проще всего и работать будет быстрее всего.

peregrine ★★★★★ ()
Ответ на: комментарий от Harald

Чем передача указателя на функцию некрасива?

const double foo(int * const (*)(int *, const int ));
comp00 ★★★★ ()
Ответ на: комментарий от peregrine

Вариант с шаблоном будет работать так же быстро. И будет при этом более универсальным.

anonymous ()

А что интерфейсы в крестах уже не комильфо? Я так сто раз делал, даже для одного единственного метода. Не знал что надо этого стыдиться.

anonymous ()
Ответ на: комментарий от anonymous

В крестах нет интерфейсов. Да, так(через абстрактный класс) не надо в большинстве случаев.

anonymous ()
Ответ на: комментарий от anonymous

Почему не надо? И как надо? По-моему интерфейс довольно нормально выглядит.

anonymous ()

Не надо делать «поэлегантнее». Плюсы не жаба, тут на элегантность всем покласть.

Miguel ★★★★★ ()
Ответ на: комментарий от anonymous

Зачем? Это клиенту нужно ещё потом наследоваться, городить классы и пр. А тут - передавай, что хочешь, лишь бы сигнатура совпадала. Хочешь - обычную функцию, хочешь - лямбду, хочешь - результат std::bind, хочешь - свой объект с operator().

anonymous ()
Ответ на: комментарий от qulinxao

Странно, а Степанов вот функторы через шаблоны принимал.

anonymous ()
Ответ на: комментарий от anonymous

жирно будет для каждой передаваемой функции код генерировать, и с проприетарщиной несовместимо.

crowbar ()
Ответ на: комментарий от anonymous

подловил ли чертяка?

думаю будет ошибкой так думать

ибо

ps. чел хотел указателей но типо безопасности добавить которая в С++ сколько ни есть

ну а typedef из посконого С эдакае перемакраподстановка с кое0какой типобезопасностью.

pps. функторы? не нислышал!

qulinxao ★★☆ ()
Ответ на: комментарий от Harald

Чем передача указателя на функцию некрасива?

Передача указателей на методы класса - это полная ж. В отличии от std::function<> и bind'a.

invy ★★★★★ ()
Ответ на: Дожились от assembler_c

Нахрена строить непонятные конструкции, когда можно просто передать указатель и вызвать его?

Например для того, чтобы std::bind-ом свернуть функцию с большим количеством аргументов до требуемой по сигнатуре, и передавать/вызывать уже в таком виде.

one_more_hokum ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.