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

时间:2018-05-18 21:11:02

标签: c++ const

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

1 个答案:

答案 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类型时,将调用第一个模板重载并进行赋值。当paramconst时,会选择第二个重载并且不执行任何操作。