具有自动功能的C ++ 17模板参数是否允许受约束的std :: function对象?

时间:2016-09-27 14:19:25

标签: c++ templates auto 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个对象约束在他们接受的函数类型上

(目前,在海湾合作委员会,我们得到error: 'auto' parameter not permitted in this context。)

1 个答案:

答案 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,但是添加了这样做的语言功能。