基于lambda的std :: function参数类型的Deduce模板参数

时间:2014-08-07 06:04:41

标签: c++ templates c++11 lambda

有没有办法将lambda传递给一个带有std::function<void(T)>参数的函数模板,并且从lambda的参数中推导出T模板参数,而不是必须明确说明它?

也就是说,给定[](std::string){...}形式的lambda,推导Tstd::string

示例:

所以使用功能模板

template<typename T>
void func(std::function<void(T)> f) { ... }

我可以通过明确指定std::string 来调用func,如下所示:

func<std::string>([](std::string){...});

我想推断std::string ,并按如下方式调用func:

func([](std::string){...});

下面的示例应用

#include <iostream>
#include <functional>

template<typename T>
void func(std::function<void(const T&)> f)
{
    T m = "hello world";
    f(m);
}

struct foo
{
    void bar(std::string msg)
    {
        std::cout << __func__ << ": " << msg << std::endl;
    }
};

int main()
{
    foo f;

    // explicit specification works
    func<std::string>([&](const std::string& m) {
        f.bar(m);
    });

    // relying on argument deduction fails
//  func([&](const std::string& m) {
//      f.bar(m);
//  });

    return 0;
}

0 个答案:

没有答案