15

ほとんどのログフレームワークと同様に、ログフレームワークは、__FUNCTION__プリプロセッサマクロを使用して現在の関数をログファイルに挿入し、ログが次のようになるようにします。

L4  T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [ENTER]
L4  T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [EXIT]
L4  T11332 609661594 [ConfigMerger::ValidateConfigObject] [ENTER]
L3  T11332 609661594 [ConfigMerger::ValidateConfigObject] Configuration Exists: 1

C ++ 11をさらに使用し始めたので、labmdasが正確であるが役に立たない__FUNCTION__出力を生成することに気づきました。

L4  T9604 609661594 [`anonymous-namespace'::<lambda1>::operator ()] Writing EMX config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\EMXConfiguration.xml
L4  T11332 609661594 [`anonymous-namespace'::<lambda3>::operator ()] Writing Auditing config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Auditing.xml
L4  T11960 609661594 [`anonymous-namespace'::<lambda2>::operator ()] Writing UEM config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Configuration.xml

ご覧のとおり、すべてのクラススコープが失われ、このロギングステートメントが匿名ラムダからのものであることがわかりました。囲んでいる機能をログアウトするための良い戦略を持っている人はいますか?これは、ログに記録するのに最も役立つように思われます...

4

1 に答える 1

12

唯一の回避策は、囲んでいる関数で__FUNCTION__(または__func__C ++ 11で)展開し、ラムダ内でそれをキャプチャすることだと思います。

void f(){
  auto& _func_ = __func__;
  [&]{ std::cout << _func_; };
}

ただし、これを「実装の品質」の問題としてタグ付けします。たとえば、GCCは、__PRETTY_FUNCTION__ラムダ(および一般的に)に対してはるかに優れた拡張を行うマクロを提供します。

#include <iostream>

struct X{
  void f(){
    []{ std::cout << __PRETTY_FUNCTION__ << "\n"; }();
  }
};

int main(){
  X().f();
}

出力:X::f()::<lambda()>

実例。

于 2012-10-04T13:35:33.727 に答える