C++:可以编码忽略const赋值?

but*_*oys 2 c++ const

我正在编写宏以减少框架中的编码,并且遇到用户可以选择输入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++编码)

Rei*_*ica 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);
Run Code Online (Sandbox Code Playgroud)

这样,当param为非const类型时,将调用第一个模板重载并进行赋值.当paramconst时,第二个重载选择和什么也不做.