如何使用std :: function作为模板

时间:2016-10-13 17:05:33

标签: 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)>)

我想知道如何在A类中构造std::function,以便我可以将不同的枚举作为参数传递给A类对象

2 个答案:

答案 0 :(得分: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 :(得分:0)

在查看您的问题后,您需要使用该功能。

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