在MACRO(X)(Y)中翻转X和Y的顺序

Eri*_*ler 6 c++ c-preprocessor

我有一个基于C++宏的DSL,它定义了一个像这样的宏:

#define RETURNS(...) \
    enable_if_t<__VA_ARGS__ WHEN

#define WHEN(...) \
    , EAT_ ## __VA_ARGS__ >

#define EAT_requires
Run Code Online (Sandbox Code Playgroud)

这是用于:

template<class T>
auto some_function(T t) ->
    RETURNS(int)
        (requires SomeConcept<T>)
Run Code Online (Sandbox Code Playgroud)

其中扩展为:

template<class T>
auto some_function(T t) ->
    enable_if_t<int, SomeConcept<T>>
Run Code Online (Sandbox Code Playgroud)

(当启用C++ 20概念时,这会扩展为实际requires子句.)

我希望翻转参数的顺序.也就是说,我希望它产生这个:

template<class T>
auto some_function(T t) ->
    enable_if_t<SomeConcept<T>, int>
Run Code Online (Sandbox Code Playgroud)

我认为这是不可能的.一些聪明的PP黑客可以证明我错了吗?

Nik*_*zev 4

如果可以容忍省略左括号,您可以这样实现:

#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>)
Run Code Online (Sandbox Code Playgroud)

输入:

template<class T>
auto some_function(T t) ->
    RETURNS(pair<int, int>)
        requires SomeConcept<T, int>)
Run Code Online (Sandbox Code Playgroud)

输出:

template<class T>
auto some_function(T t) ->
    enable_if_t< SomeConcept<T, int>, pair<int, int> >
Run Code Online (Sandbox Code Playgroud)