模板化std :: function参数与非模板

时间:2016-10-10 10:16:01

标签: c++ templates lambda std-function

我正在尝试创建一个函数,它接受任何返回void的函数,并通过简单地调用原始函数并返回false来生成返回bool的函数。

template<typename Arg>
auto voidToBoolTemplate(std::function<void(Arg)> func)
{
    return [&](Arg arg)
    {
        func(arg);
        return false;
    };
}

但是,我无法将lambda传递给此函数。

auto lambda = [](int x)
{
    std::cout << x << '\n';
};

voidToBoolTemplate(lambda);

这是我用clang 3.7.0得到的错误:

Error(s):
source_file.cpp:32:5: error: no matching function for call to 'voidToBoolTemplate'
    voidToBoolTemplate(lambda);
    ^~~~~~~~~~~~~~~~~~
source_file.cpp:5:6: note: candidate template ignored: could not match 'function<void (type-parameter-0-0)>' against '(lambda at source_file.cpp:25:19)'
auto voidToBoolTemplate(std::function<void(Arg)> func)

将lambda分配给std :: function,然后调用该函数。

auto lambda = [](int x)
{
    std::cout << x << '\n';
};

std::function<void(int)> foo = lambda;

voidToBoolTemplate(foo);

另外,如果我为参数使用特定类型,我可以传递lambda:

auto voidToBoolNonTemplate(std::function<void(int)> func)
{
    return [&](int arg)
    {
        func(arg);
        return false;
    };
}

auto lambda = [](int x)
{
    std::cout << x << '\n';
};

voidToBoolNonTemplate(lambda);

任何人都可以解释这种行为吗?

现场演示:http://rextester.com/COKT94318

0 个答案:

没有答案