Как использовать std::function в качестве шаблона

#c #c 11

#c #c 11

Вопрос:

Я новичок в этой std::function концепции.

Мне нужно использовать std::function следующим образом

У меня есть класс следующим образом

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

здесь std::function<void()> должны приниматься разные параметры от разных объектов.
Параметры будут в основном разными типами перечислений

например

 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)>)
 

Я хочу знать, как я должен структурировать std::function класс A, чтобы я мог передавать различные перечисления в качестве параметра объектам класса A

Комментарии:

1. Как вы хотите использовать std::function ?

2. Класс с параметрами? Ты имеешь в виду конструктора, верно?

3. В качестве шаблона? Что

4. @Jarod42::я не знаю, как мне следует использовать std::function здесь. пожалуйста, предложите, как я могу использовать

5. @shadowlif::да, вы правы.конструктор

Ответ №1:

В качестве параметра можно передать тип шаблона std::function . Вот пример:

 #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;
}
 

Вывод:

 34.2
Test!
 

Комментарии:

1. Большое спасибо. это поможет

2. @user5222584 если и когда кто-то решит вашу проблему, нажмите на галочку, чтобы отметить это как решение вашей проблемы.

Ответ №2:

После рассмотрения вашего вопроса, вот как вам нужно использовать функцию.

 #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);
}
 

Комментарии:

1. итак, у меня нет определенного перечисления, которое будет использоваться для всех объектов