我正在编写宏以减少框架中的编码,并且遇到用户可以选择输入const限定符的问题.问题是稍后的宏可能会尝试将值分配给该值.如果参数是const,我希望简单地忽略赋值.
下面简单的宏演示了我的反对意见:
#define DECLARE_AND_ASSIGN(type, param, init_val, later_val) \
type param = init_val; \
param = later_val;
Run Code Online (Sandbox Code Playgroud)
以下工作正常:
DECLARE_AND_ASSIGN( int, foo, 0, 42 )
Run Code Online (Sandbox Code Playgroud)
但是这显然无法编译,因为初始化后正在分配const:
DECLARE_AND_ASSIGN( const int, bar, 0, 42 )
Run Code Online (Sandbox Code Playgroud)
有没有办法对宏进行编码,以便编译器忽略被赋值的const值?(在VS2017上使用C++编码)
您可以使用这样的帮助器包装赋值:
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);
Run Code Online (Sandbox Code Playgroud)
这样,当param为非const类型时,将调用第一个模板重载并进行赋值.当param是const时,第二个重载选择和什么也不做.