gpt4 book ai didi

c++ - 翻转 MACRO(X)(Y) 中 X 和 Y 的顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:43 24 4
gpt4 key购买 nike

我有一个基于 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 黑客能证明我错了吗?

最佳答案

如果省略一个左括号是可以容忍的,你可以这样实现:

#define UNWRAP(...) __VA_ARGS__

#define RETURNS(...) \
WHEN ((__VA_ARGS__),

#define WHEN(x, ...) \
enable_if_t<EAT_ ## __VA_ARGS__, UNWRAP x>

#define EAT_requires

template<class T>
auto some_function(T t) ->
RETURNS(pair<int, int>)
requires SomeConcept<T, int>)

输入:

template<class T>
auto some_function(T t) ->
RETURNS(pair<int, int>)
requires SomeConcept<T, int>)

输出:

template<class T>
auto some_function(T t) ->
enable_if_t< SomeConcept<T, int>, pair<int, int> >

关于c++ - 翻转 MACRO(X)(Y) 中 X 和 Y 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54657947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com