具有自动功能的 C++17 模板参数是否允许受约束的 std::function 对象?
Will C++17 template arguments with auto feature allow constrained std::function objects?
随着 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
个对象 受限于它们接受的函数类型?
(目前,在 GCC 上我们得到一个 error: 'auto' parameter not permitted in this context
。)
这些不是非类型模板参数,因此在 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
,但添加了这样做的语言功能。
随着 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
个对象 受限于它们接受的函数类型?
(目前,在 GCC 上我们得到一个 error: 'auto' parameter not permitted in this context
。)
这些不是非类型模板参数,因此在 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
,但添加了这样做的语言功能。