我正在编写宏以减少框架中的编码,并且遇到了用户可以选择输入const限定符的问题。问题是稍后的宏可能会尝试将值分配给该值。如果参数是const,我希望简单地忽略赋值。
下面的简单宏演示了我的反对意见:
#define DECLARE_AND_ASSIGN(type, param, init_val, later_val) \
type param = init_val; \
param = later_val;
以下工作正常:
DECLARE_AND_ASSIGN( int, foo, 0, 42 )
但显然无法编译,因为初始化后会分配const:
DECLARE_AND_ASSIGN( const int, bar, 0, 42 )
有没有办法对宏进行编码,以便编译器忽略被赋值的const值? (在VS2017上使用C ++编码)
答案 0 :(得分:5)
你可以用这样的帮助器包装作业:
template <class T, class A>
void assignNonConst(T &v, A &&a)
{
v = std::forward<A>(a);
}
template <class T, class A>
void assignNonConst(const T&, A&&)
{}
#define DECLARE_AND_ASSIGN(type, param, init_val, later_val) \
type param = init_val; \
assignNonConst(param, later_val);
这样,当param
为非const
类型时,将调用第一个模板重载并进行赋值。当param
为const
时,会选择第二个重载并且不执行任何操作。