【发布时间】: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 组中提出了这样的提案的想法,但没有很多支持。事实上恰恰相反。