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);
};
答案 0 :(得分:1)
我只是试图覆盖Why it so?
部分,假设你像smth一样
注意:候选模板被忽略:显式指定无效 第一个模板参数的参数
n4618 14.1.11说:
不得遵循功能模板的模板参数包 通过另一个模板参数,除非该模板参数可以 从函数模板的参数类型列表(8.3.5)推导出来 或者有一个默认参数(14.8.2)。
cppreference同样暗示:
在函数模板中,模板参数包可能会更早出现 在列表中提供了所有以下参数可以从中推导出来 函数参数
您的第一个参数包不在函数参数中,因此无法正确推断它