是否有一些忍者诀窍,使其声明后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名。