#include <iostream>
#include <string>
#include <functional>

using namespace std;

void Fct1();
void Fct2(int &A);
void Fct3(int A);
void Fct4(float &B, char &C, string &D);
void Fct5(float B, char C, string D);
string Fct6(float B, char C, string D);

// ostream &(*pfs)(ostream &o)Fct6Bis(float B, char C, string D);

function<ostream &(ostream &)> Fct6Bis(float B, char C, string D);

void main()
{
    int A;
    float B;
    char C;
    string D;

    Fct1();
    Fct2(A);
    Fct3(A);
    Fct4(B, C, D);
    Fct5(B, C, D);
    cout << "Voici la solution de cette fonction" << Fct6(B, C, D);
    cout << "\n";
    //   cout << "Voici la solution de cette fonction (bis)" << Fct6Bis(B, C, D);
}

void Fct1()
{
    cout << "Bonjour" << endl;
}

void Fct2(int &A)
{
    cout << "Entrez la valeur de l'entier A : ";
    cin >> A;
}

void Fct3(int A)
{
    cout << "Le double de A vaut : " << (A * 2) << endl;
}

void Fct4(float &B, char &C, string &D)
{
    cout << "Entrez la valeur du float B : ";
    cin >> B;
    cout << "Entrez la valeur du char C : ";
    cin >> C;
    cout << "Entrez la valeur du string D : ";
    // cin.getline(D);
    cin >> D;
}

void Fct5(float B, char C, string D)
{
    cout << "La valeur de B vaut : " << B << endl;
    cout << "La valeur de C vaut : " << C << endl;
    cout << "La valeur de D vaut : " << D << endl;
}

string Fct6(float B, char C, string D)
{
    return " La valeur de B vaut : " + to_string(B) + ", " + "La valeur de C vaut : " + to_string(C) + ", " + "La valeur de D vaut : " + D + ".";
}

function<ostream &(ostream &)> Fct6Bis(float B, char C, string D)
{
    auto a = [](ostream &o) -> ostream &
    {
        return o << "HelloWorld";
    };

    return a;
}