2012-10-04 6 views
12

当社のロギングフレームワークは、ほとんどのロギングフレームワークのように、私たちのロギングが見えるように、ログファイルに現在の関数を挿入するために__FUNCTION__プリプロセッサマクロを使用していますように:私たちはC++ 11以上を使用し始めてきたようにラムダの内部で関数名を記録する良い方法はありますか?

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 

、私は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 

を、すべてのクラスのスコープが失われていると、私たちが今知っているすべては、このロギング文が匿名ラムダから来たということです。誰もが包囲関数をログアウトするための良い戦略を持っていますか?これは、ログに記録する最も有用なものと思われる...

+0

http://stackoverflow.com/questions/4434282/visual-c-file-line-and-pretty-functionと同等の機能 '' __FUNCSIG__''がlambdaを与えるのは何ですか? – BoBTFish

+0

haa、VS2012は次のように表示しています: 'wmain :: :: operator()' – Benj

+0

少なくともそれは囲み関数を示しています... – Benj

答えて

9

唯一の回避策は、包囲関数で__FUNCTION__(または__func__)を展開してラムダの中に取り込むことです。

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()>

Live example.

+4

+1です。 – Benj

関連する問題