funkcja jako parametr w funkcji

0

Cześć.
Istnieje jakaś możliwość użycia funkcji w funkcji?

coś ala:


void cos(void funkcja());
void cos2();

int main(){
   cos();
}

void cos(void funkcja()){
    cout << "blabla a teraz część dalsza z innej funkcji:" << endl;

    funkcja();
}

void cos2(){
    cout << "tutaj druga funkcja zglaszam sie" << endl;
}
0

poprawka maina:


int main(){
cos(cos2());

}
0

No tak, poczytaj o wskaźnikach do funkcji. W Twoim przypadku będzie to wskaźnikiem jest void (*funkcja)(). Po poprawce Twój kod działa: http://ideone.com/5WZfi5

Możesz też zainteresować się std::function. Dobrym pomysłem jest też używanie typedef.

0

W c++ jest coś takiego jak wskaźnik na funkcję, polecam się zapoznać z tym zagadnieniem.

0
void cos(void (*funkcja)()){
    cout << "blabla a teraz część dalsza z innej funkcji:" << endl;

    funkcja();
}

void cos2(){
    cout << "tutaj druga funkcja zglaszam sie" << endl;
}

int main(){
    cos(cos2);
}
0

Lub tak

template<typename T>
void cos(T funkcja){
    cout << "blabla a teraz część dalsza z innej funkcji:" << endl;

    funkcja();
}

void cos2(){
    cout << "tutaj druga funkcja zglaszam sie" << endl;
}

int main(){
    cos(cos2);
}

Ten sposob jest preferowany z tego wzgledu, ze oprocz funkcji mozna tez przekazac funktor (czyli obiekt z przeciazonym operatorem()) a takze kompilator ma wieksze mozliwosci optymalizacji.

0

"a takze kompilator ma wieksze mozliwosci optymalizacji" - co to - to nie. - _13th_Dragon dzisiaj, 15:26

Za kazdym razem jak wspomne o optymalizacji zawsze sie znajdzie ktos, kto stwierdzi ze jest inaczej - normalnie puszka pandory [rotfl]
Kompilator ma tendencje do lepszego inlineowania funkcji szablonowych niz funkcji - chociazby ze wzgledu na to, ze funkcji szablonowej nie mozna umiescic w osobnej jednostce kompilacji (ale nie tylko dlatego). Do tego funktory sa lepiej inlineowane niz wskazniki na funkcje.
Chyba najprostszy mozliwy kod:

#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <algorithm>

class Pred
{
public:
    bool operator()(int a, int b)
    {
        return a <b;
    }
};

bool compare(int a, int b)
{
    return a < b;
}

int main(){
    int a[3] = {1,2,3};

    std::sort(a, a+3, Pred());
    std::sort(a, a+3, &compare);
}

Kompilacja:VC++ 2010 Release
W pierwszym przypadku predykat zostaje zinleinowany w drugim compare jest wolana za kazdym razem:
call dword ptr [_Pred]

0

Ten przykład nie ma sensu. Jeżeli wpisałeś definicję funkcji bezpośrednio w deklarację klasy to ona jest domyślnie tak, jakby była opatrzona słowem kluczowym inline. W funkcji inline nie dopisałeś i kompilator Cię posłuchał. Może kompilowałeś bez optymalizacji? Poza tym jak wiadomo te słowo kluczowe to tylko podpowiedź - kompilator ma prawo zrobić jak chce (zignorować/zrobić inline bez żadnej podpowiedzi).

Nie wydaje mi się, żeby zastosowanie szablonów dawało jakieś dodatkowe możliwości optymalizacji poza tymi wynikającymi z faktu dostępności całego kodu źródłowego. (Z zastosowaniem LTO i to może nie mieć znaczenia) A szablony kompilują się dłużej.

0

Po pierwsze VC++ calkowicie olewa slowo kluczowe inline (o tym jest w dokumentacji) tym bardziej olewa to czy kod jest klasie czy nie. Sprawdzilem jak jest poza - wynik ten sam.
Po drugie sprawdzilem __forceinline przy funkcji compare - wynik ten sam - dalej jest call.
Po trzecie - tak wiem, ze nie powinno byc zadnej roznicy - kompilator powinien ladnie wyczaic, ze Pred i compare to w zasadzie to samo i obydwa zinlineowac; tylko co z tego skoro tego nie robi nawet w banalnym przypadku?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0