我有一个基于C++宏的DSL,定义了如下所示的一个宏:
#define RETURNS(...) \
enable_if_t<__VA_ARGS__ WHEN
#define WHEN(...) \
, EAT_ ## __VA_ARGS__ >
#define EAT_requires
这是用于类似以下方式的:
template<class T>
auto some_function(T t) ->
RETURNS(int)
(requires SomeConcept<T>)
这将扩展为:
template<class T>
auto some_function(T t) ->
enable_if_t<int, SomeConcept<T>>
当启用C++20概念时,它会扩展为一个真正的requires
子句。
我更喜欢参数的顺序被翻转。也就是说,我希望它生成这个:
template<class T>
auto some_function(T t) ->
enable_if_t<SomeConcept<T>, int>
我觉得这是不可能的。有没有聪明的PP黑客可以证明我错了?
template<A,B> enable_if_t_reversed<A,B> : enable_if_t<B,A>
是否可行? - Nicanenable_if_t
内部没有短路 -- 反转参数不会改变任何东西。 - Quentinfast_enable_if<false>::sfinae
已经是一种替换失败了 - 而我们是从左到右实例化的。将条件放在第一位可以让你摆脱这个问题。(此外,在这种情况下,我们并不是试图避免由于硬错误而实例化,而是试图避免由于额外的编译时间工作而实例化) - Barry