使用non-type template arguments with auto即将推出的C ++ 17功能,是否可以以能够放置以下功能的方式实现std::function
:
bool f(int n, double d) {}
bool g(bool b, char c) {}
bool h(bool b) {}
进入自动模板std::function
个对象:
std::function<bool(auto, auto)> faa = f; // ok
std::function<bool(int, auto)> fia = f; // ok
std::function<bool(double, auto)> fda = f; // error: function type mismatch
std::function<bool(auto, auto)> gaa = g; // ok
std::function<bool(auto, auto)> haa = h; // error: function type mismatch
std::function<bool(auto)> ha = h; // ok
等等。
换句话说,让std::function
个对象约束在他们接受的函数类型上?
(目前,在海湾合作委员会,我们得到error: 'auto' parameter not permitted in this context
。)
答案 0 :(得分:7)
那些不是非类型模板参数,因此在C ++ 17中不允许使用auto
。
非类型模板参数是指针或整数或类似的模板的参数,实际值,而不是类型。
例如,
std::integral_constant<std::size_t, 7>;
此处7
是类型为std::size_t
且值为7
的非类型模板参数。
非类型模板auto
允许以下内容:
template<auto x>
using integral = std::integral_constant< decltype(x), x >;
现在integral<7>
是std::integral_constant<int, 7>
。
另一方面,您使用auto
代替类型,而不是非类型。
有一个功能可以推导出模板的类型,所以你可以写:
std::function faa = f;
如果他们扩充std::function
以便能够从函数指针(或非模板可调用)中推断出签名。
但请注意,此std::function
具有固定签名,而不是模板签名。该功能只允许演绎,而不是模板动态调度。
我不知道在C ++ 17中是否以这种方式扩充了std::function
,但是添加了这样做的语言功能。