如何std :: bind模板化函数?

时间:2017-01-13 00:57:29

标签: c++ templates c++14 variadic-templates

1)我将函数声明为

    template< unsigned ... N, typename ... T2>
    auto Foo(T2 ... args);

当它调用例如

时,它可以正常工作
double a = Foo<1>(1.0);

但是甚至没有编译为

double a = Foo<1,double>(1.0);

为什么会这样?

2)实际问题是以下两者都没有编译,那么如何正确bind

 std::function<double(double)> f = std::bind(&Foo<1>,std::placeholders::_1); 
 std::function<double(double)> g = std::bind(&Foo<1,double>,std::placeholders::_1); 

修改
感谢Jonathan Wakely 3)std::bind来自

的原因
class Bar
{
    Bar(std::function<T(T)> &f);
};

1 个答案:

答案 0 :(得分:1)

我只是试图覆盖Why it so?部分,假设你像smth一样

  

注意:候选模板被忽略:显式指定无效   第一个模板参数的参数

n4618 14.1.11说:

  

不得遵循功能模板的模板参数包   通过另一个模板参数,除非该模板参数可以   从函数模板的参数类型列表(8.3.5)推导出来   或者有一个默认参数(14.8.2)。

cppreference同样暗示:

  

在函数模板中,模板参数包可能会更早出现   在列表中提供了所有以下参数可以从中推导出来   函数参数

您的第一个参数包不在函数参数中,因此无法正确推断它