【C++】/人◕ ‿‿ ◕人\ < わけがわからないよ
プログラミングしてたらちょっと頭を抱えたくなる意味不明な事態に遭遇.
能力不足ゆえの事態ではありますが考えても意味がわからなかったので書いておきます.
「値が変更されていた場合にtrueを返す関数」を返却する関数を作成しようと思い,まずはこんな感じのコードを書いてみました.
#include <functional> template<typename Type> std::function<bool()> isChanged(Type &Value){ Type* Ptr = new Type(Value); return [&](){ // Check bool Result = !(Value == *Ptr); // Copy *Ptr = Value; // End return Result; }; }
要はValueのコピーを作成し,値を比較してその結果を返却する関数です.何度もtrueが返却される事態を防ぐために,一度検知したらコピーの値を上書きしています.で,こんな感じで使おうと思っていました.
int main() { int count = 0; bool EndFlag = false; std::function<bool()> Bf = isChanged<bool>(EndFlag); // EndFlagが変更されていた場合trueが返されループを抜ける while(Bf() == false){ count++; std::cout << count << std::endl; if(count >= 100){ EndFlag = true; } } return 0; }
さて,実行しよう.
test.exeは動作を停止しました
問題の解決策をオンラインで確認できます。
▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああああああ
え,だってこれじゃダメでしょ…?
#include <functional> template<typename Type> std::function<bool()> isChanged(Type &Value){ Type& Ptr = Type(Value); return [&](){ // Check bool Result = !(Value == Ptr); // Copy Ptr = Value; // End return Result; } }
test.exeは動作を停止しました
だよねえ….ならこうすればいいの…?
#include <functional> template<typename Type> std::function<bool()> isChanged(Type &Value){ Type* Ptr = new Type(Value); auto Inv = *Ptr; return [&](){ // Check bool Result = !(Value == Inv); // Copy Inv = Value; // End return Result; } }
test.exeは動作を(ry
これでもやっぱりダメそう.「この方法じゃダメなのか」と思いながらこれも試してみる.
#include <functional> template<typename Type> std::function<bool()> isChanged(Type &Value){ Type* Ptr = new Type(Value); Type& Inv = *Ptr; return [&](){ // Check bool Result = !(Value == Inv); // Copy Inv = Value; // End return Result; } }
成功した.
どうなってるんですかこれ.最初の方法がダメでこっちなら大丈夫な理由がいまいちわからないでござるよ.