首页 > 解决方案 > 是否有统一函数类型限定符和简化可恶函数类型的建议?

问题描述

在处理基于函数类型匹配的模板时,可恶的函数类型组合可能是一个真正的痛苦(参见std :: is_function)。

其他限定符,包括 const、volatile、&、&&、noexcept(加上可变参数支持)可能会导致大量模板特化。

但是,说明noexcept符允许使用布尔表达式noexcept(expr)

所以,在未来,我们可以想象用这个模型统一所有的限定词:

而且,锦上添花,使限定词可扣除,以便能够编写如下内容:

template <typename Fn>
struct function_traits;

template <typename R, bool CQ, bool VQ, bool LVRQ, bool RVRQ, bool NEQ, ARGS... Args>
struct function_traits<R(Args...) const(CQ) volatile(VQ) &(LVRQ) &&(RVRQ) noexcept(NEQ)>
{
    static constexpr bool is_const_qualified = CQ;
    static constexpr bool is_volatile_qualified = VQ;
    static constexpr bool is_lvalue_ref_qualified = LVRQ;
    ...
};

我想听听有关此类问题的任何想法。

标签: c++templatesc++17c++20

解决方案


我之前在 std-proposals 邮件列表上提出了类似的建议。请参阅此处此处的线程。

这次讨论的结论是,在语言中添加这样的特性需要做很多工作。不仅有必要在语言中添加规则来推导限定符的布尔参数,而且还会有许多其他问题,例如限定符被实例化和评估的点。如此规模的提案也可能会引入许多其他必须敲定的问题。

Gašper Ažman 似乎相信某种形式的“计算推论”将是解决该问题的替代解决方案,而且更可行。如果您有兴趣帮助完成这项工作,那么我建议您与他联系。


推荐阅读