【问题标题】:Is there any proposal to uniformize function type qualifiers and simplify abominable function types?是否有统一函数类型限定符和简化可恶函数类型的建议?
【发布时间】:2020-02-11 15:29:27
【问题描述】:

abominable function types 组合在处理基于函数类型匹配的模板时可能会很痛苦(请参阅std::is_function)。

包括 const、volatile、&、&&、noexcept 在内的各种限定符(加上可变参数支持)可能会导致大量模板特化。

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

  • noexcept 默认等同于 noexcept(true)

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

  • const 限定符将等同于 const(true)
  • volatile 限定符将等同于 volatile(true)
  • & 限定符将等同于 &(true)
  • && 限定符将等同于 &&(true)

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

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++ 的语法太简单了,稍微复杂一点正是让它成为世界上最伟大的编程语言所需要的。
  • 只是为了确保我了解您的动机。你指的是std::is_function的实现,对吧?因为这项工作已经完成,您不必再处理这种复杂性,因为std::is_function 已经存在
  • 是的,std::is_function 已经存在,但 std::callable_traits 不存在。您是否认为实现自己的 callable_traits 或使用类似 boost 的实用程序可以解决所有暗示基于函数类型的模板专业化的情况。不确定...
  • 虽然我喜欢拥有它的想法,但我认为它的需求并不大。加上山姆所说的。
  • 有趣的是,我确实在 std-proposals google 组中提出了这样的提案的想法,但没有很多支持。事实上恰恰相反。

标签: c++ templates c++17 c++20


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2016-11-09
    • 2010-11-11
    • 1970-01-01
    • 2015-02-04
    • 2017-12-10
    相关资源
    最近更新 更多