Asrock Z68 Extreme 7 gen 3 | EVGA GTX580 SLI | Intel i7 2600k | Corsair Vengeance 16GB
Corsair H80 | Corsair Force 3 120gb | HX1050 |NZXT Phantom | Samsung 22" SA300
Sony VAIO pro 13
i7 8GB 256GB
Hejsan jag har suttit och grubblat i några dagar på hur jag ska lösa det men har inte haft någon lycka med att lösa detta och vänder mig därför hit till de visare.
Min fråga är om det går att skicka med en funktion i parametrarna till en annan funktion och sedan få den med skickade funktionen att köras i den yttre funktionen. Ett exempel med beskrivning kommer nedan.
Exempel 1
void function_A(){
cout << "I am function A" << endl;
}
void function_B(){
cout << "I am function B" << endl;
}
void function_C(void function()){
function();
}
int main(){
function_C(function_A());
function_C(function_B());
}
Detta är mitt problem fast ner dummat men lösning bör bli den samma, vad jag försöker åstadkomma är att man kan skicka med tex funktion_A eller funktion_B in funktion_C parametrar ( ) för att den sedan ska köra funktionen.
Det finns ett uppenbart problem med kodning i funktions_C parametrar som gör koden icke körbar, men undrar om det finns möjlighet på nåt tips för att lösa mitt problem.
Tack på förhand!
Asrock Z68 Extreme 7 gen 3 | EVGA GTX580 SLI | Intel i7 2600k | Corsair Vengeance 16GB
Corsair H80 | Corsair Force 3 120gb | HX1050 |NZXT Phantom | Samsung 22" SA300
Sony VAIO pro 13
i7 8GB 256GB
Länken till stackoverflow visar hur man skickar en pekare till en funktion som argument, i ditt fall skulle det se ut så här
#include <iostream>
using namespace std;
void function_A(){
cout << "I am function A" << endl;
}
void function_B(){
cout << "I am function B" << endl;
}
void function_C(void(*fn)(void)){
fn();
}
int main(){
function_C(function_A);
function_C(function_B);
}
Om du lär dig C++ idag så kan man utgå från att det är C++11 som är intressant och enligt t.ex. Microsoft så finns det absolut ingen anledning att använda äldre varianter av C++, C++11 är även det rekommenderade sättet i moderna versioner av g++ och clang. Då skulle det i stället se ut så här
#include <functional>
#include <iostream>
using namespace std;
void function_A() {
cout << "I am function A" << endl;
}
void function_B() {
cout << "I am function B" << endl;
}
void function_C(function<void(void)> fn) {
fn();
}
int main(){
function_C(function_A);
function_C(function_B);
}
Fördelen med det senare är, förut en syntax som i alla fall jag tycker är enklare att begripa, är att std::function<> kan ta alla former av entiteter som kan anropas. Är definitivt överkurs för någon som precis börjat med C++ men kan ändå ge lite exempel på saker som man kan göra med std::function<> som inte fungerar med funktionspekare.
#include <functional>
#include <iostream>
using namespace std;
struct C {
int m;
C(int __m) : m(__m) { }
// Make the object 'callable'
void operator()(void) const {
cout << "In class C where member m=" << m << endl;
}
};
function<void(void)>
closure(int x)
{
return [=](void) { cout << "In closure with encapsulated value x=" << x << endl; };
}
void
will_be_returned_by_fun()
{
cout << "In function without associated state" << endl;
}
function<void(void)>
fun()
{
// This can be done even with function pointers
return will_be_returned_by_fun;
}
int
main()
{
function<void(void)> fn;
fn = fun();
fn();
fn = closure(17);
fn();
fn = C(42);
fn();
}
Kör man de sista programmet så får man
In function without associated state
In closure with encapsulated value x=17
In class C where member m=42
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Copyright © 1999–2024 Geeks AB. Allt innehåll tillhör Geeks AB.
Citering är tillåten om källan anges.