给定一个可能带有cv-qualifier-seq和可能ref-qualifier的 varargs 函数类型,是否可以编写一个类型特征来去除所有限定符而无需编写 4 * 3 * 2 = 24 部分特化?
template<class T>
struct strip_function_qualifiers;
template<class R, class... Args>
struct strip_function_qualifiers<R(Args...)> { using type = R(Args...); };
template<class R, class... Args>
struct strip_function_qualifiers<R(Args..., ...)> { using type = R(Args..., ...); };
template<class R, class... Args>
struct strip_function_qualifiers<R(Args...) const> { using type = R(Args...); };
template<class R, class... Args>
struct strip_function_qualifiers<R(Args..., ...) const > { using type = R(Args..., ...); };
template<class R, class... Args>
struct strip_function_qualifiers<R(Args...) const &> { using type = R(Args...); };
template<class R, class... Args>
struct strip_function_qualifiers<R(Args..., ...) const & > { using type = R(Args..., ...); };
// etc. etc. for each possible combination (24 in total)
随着新的事务性内存 TS的加入transaction_safe
,这是否意味着我们需要为此编写 48 个部分特化?
编辑:引用这些奇怪函数类型的描述([dcl.fct]/p6,引用 N4140):
具有cv-qualifier-seq或ref-qualifier的函数类型 (包括由 typedef-name (7.1.3, 14.1) 命名的类型)应仅显示为:
- 非静态成员函数的函数类型,
- 指向成员的指针所指的函数类型,
- 函数 typedef 声明或alias-declaration的顶级函数类型,
- 类型参数 (14.1) 的默认参数中的类型ID ,或
- 类型参数(14.3.1)的模板参数的类型 ID。
[示例:
typedef int FIC(int) const; FIC f; // ill-formed: does not declare a member function struct S { FIC f; // OK }; FIC S::*pm = &S::f; // OK
—结束示例]
函数声明器中cv-qualifier-seq的效果与在函数类型之上添加 cv-qualification 不同。在后一种情况下,将忽略cv 限定符。[注意:具有cv-qualifier-seq的函数类型不是 cv-qualified 类型;没有 cv 限定的函数类型。—尾注] [示例:
typedef void F(); struct S { const F f; // OK: equivalent to: void f(); };
—结束示例]
返回类型、parameter-type-list、 ref-qualifier和cv-qualifier-seq,但不是默认参数 (8.3.6) 或异常规范 (15.4),是函数类型的一部分。[注意:函数类型在函数指针、函数引用和成员函数指针的赋值和初始化过程中被检查。——尾注]