是否有一些忍者诀窍,使其声明后variables常量?

我知道答案是99.99%不,但我认为这是值得一试,你永远不知道。

void SomeFunction(int a) { // Here some processing happens on a, for example: a *= 50; a %= 10; if(example()) a = 0; // From this point on I want to make "a" const; I don't want to allow // any code past this comment to modify it in any way. } 

我可以做一些有点类似const int b = a; ,但它不是真的一样,它造成了很多混乱。 一个C ++ 0x-only解决scheme是可以接受的。

编辑 :另一个不太抽象的例子,让我问这个问题的例子:

 void OpenFile(string path) { boost::to_lower(path); // I want path to be constant now ifstream ... } 

编辑 :另一个具体的例子: 在平行部分重新获取variables的恒常性 。

一种解决scheme是将所有的突变代码分解成一个lambdaexpression式。 执行lambdaexpression式中的所有变化,并将结果分配给方法范围中的const int 。 例如

 void SomeFunction(const int p1) { auto calcA = [&]() { int a = p1; a *= 50; a %= 10; if(example()) a = 0; .. return a; }; const int a = calcA(); ... } 

您可以将代码移动到另一个函数中:

 int ComputeA(int a) { a *= 50; a %= 10; if (example()) a = 0; return a; } void SomeFunction(const int a_in) { const int a = ComputeA(a_in); // .... } 

否则,在编译时就没有好办法做到这一点。

我以前使用的模式是用_隐藏参数,所以代码变成了

 void SomeFunction(int _a) { // Here some processing happens on a, for example: _a *= 50; _a %= 10; if(example()) _a = 0; const int a = _a; // From this point on I want to make "a" const; I don't want to allow // any code past this comment to modify it in any way. } 

如果需要的话,你也可以只使用常量variables,并创build一个函数来计算a的新值。 我更倾向于更多地不重复使用variables,尽可能使我的variables不变:如果你改变某个值的值,那么给它一个新的名字。

 void SomeFunction(const int _a) { const int a = preprocess(_a); .... } 

为什么不重构你的代码到两个单独的函数。 一个返回一个修改a和另一个在这个值上工作(而不会改变它)。

你也可以把你的对象放在一个持有者类对象的周围,并与这个持有者一起工作。

 template <class T> struct Constify { Constify(T val) : v_( val ) {} const T& get() const { return v_; } }; void SomeFuncion() { Constify ci( Compute() ); // Compute returns `a` // process with ci } 

你的例子有一个简单的修复:重构。

 // expect a lowercase path or use a case insensitive comparator for basic_string void OpenFile(string const& path) { // I want path to be constant now ifstream ... } OpenFile( boost::to_lower(path) ); // temporaries can bind to const& 

这可能是一个办法,如果你只是想避免另一个名字。 我build议你在使用之前三思。

 int func () { int a; a %= 10; const int const_a = a; #define a const_a a = 10; // this will cause an error, as needed. #undef a } 

我其实不build议这样做,但是你可以使用创意variables阴影来模拟你想要的东西:

 void SomeFunction(int a) { // Here some processing happens on a, for example: a *= 50; a %= 10; if(example()) a = 0; { const int b = a; const int a = b; // New a, shadows the outside one. // Do whatever you want inside these nested braces, "a" is now const. } } 

当然,在C ++中没有办法使用相同的variables名。

Interesting Posts