#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. итак, у меня нет определенного перечисления, которое будет использоваться для всех объектов