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黑客可以证明我错了吗?
如果可以容忍省略左括号,您可以这样实现:
#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)
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |