user5222584
user5222584

Reputation: 13

How to use std::function as a template

I am new to the std::function concept.

I need to use std::function in following way

I have a class as follows

class A(string ,bool, string, std::function<void()>)

here the std::function<void()> should take different parameters from different objects. The parameters will be basically different types of enumerations

for example

1)A a(string ,bool, string, std::function<void(enum xyz)>)
2)A b(string ,bool, string, std::function<void(enum abc)>)
3)A c(string ,bool, string, std::function<void(enum efg)>)

I want to know how should i structure the std::function in class A so that i can pass different enumerations as parameter to the class A objects

Upvotes: 0

Views: 116

Answers (2)

Pavan Chandaka
Pavan Chandaka

Reputation: 12821

After looking at your question, this is how you need to use the function.

#include <iostream>
#include <string>
#include <functional> //Need to include for std::function use

using namespace std;

//Declare the ENUM here.
enum ePat {xyz=1,abc,efg,mno};
enum ePat_second {def=1,ghi,jkl,opq};


//utility function you want to pass to std function
template <typename T>
void print(T e)
{

}

template <typename T>
class A
{
    public:

    //Constructore with std function as one of the argument
    A(string ,bool , string, std::function<void(T)>)
    {


    }

};

int main()
{
    //Declare your std function types.
     std::function<void(ePat)> xyz_display = print<ePat>;
     std::function<void(ePat_second)> def_display = print<ePat_second>;


    //Pass it to the object.
    A<ePat> a("abc" ,true, "abc",xyz_display);
    A<ePat_second> b("def" ,true, "def",def_display);
}

Upvotes: 0

Chad
Chad

Reputation: 19052

You can pass a template type as the std::function parameter. Here's an example:

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

template <class T>
class Foo
{
public:
   Foo(std::function<void(T)> f) : f_{f} {}

   void call(T in) { f_(in); }

private:
   std::function<void(T)> f_;
};

int main()
{
    Foo<double> fd{[] (double d) { std::cout << d << '\n'; }};
    fd.call(34.2);

    Foo<std::string> fs{[] (std::string s) { std::cout << s << '\n'; }};
    fs.call("Test!");
    return 0;
}

Output:

34.2
Test!

Upvotes: 1

Related Questions