我需要一个宏,该宏在作为参数传递给它的代码中用一个标识符替换另一个标识符。要解决我的任务,只需定义REPLACE_X_WITH_Y即可使此代码编译:
#define REPLACE_X_WITH_Y(...) __VA_ARGS__ //TODO: replace x with y
int main()
{
REPLACE_X_WITH_Y(
int x = 5;
x = 0;
);
return y;
}
但是,最好有一个通用宏REPLACE:
#define REPLACE(x, y, ...) __VA_ARGS__ //TODO: replace x with y
int main()
{
REPLACE(x, y,
int x = 5;
x = 0;
);
return y;
}
使用C ++预处理程序可以使用这些宏吗?
我的实际用例是在较旧的编译器上模拟一种特定情况的概念:
#define REQUIRES(...) template<class T_=T, enable_if_t<REPLACE_T_WITH_T_(__VA_ARGS__), int>* = nullptr>
template<typename T> struct S
{
REQUIRES(is_integral_v<T>) int f(T x) {return 0;}
REQUIRES(is_floating_point_v<T>) int f(T x) {return 1;}
};
我看不到执行这种涉及的操作的方法,但是在您的特定情况下,您不需要它。您需要SFINAE的从属上下文,但是它可以很好地按原样启动您的条件,并将其绑定到您可以控制的从属位:
template <class, bool Value>
struct dependent_bool
: std::integral_constant<bool, Value> { };
#define REQUIRES(...) \
template< \
class Require_T = void, \
::std::enable_if_t< \
dependent_bool<Require_T, (__VA_ARGS__)>::value,\
int \
>* = nullptr \
>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句