簡體   English   中英

有沒有更好的方法在C ++中實現類似Java的本地類?

[英]Is there a better way implementing Java-like local class in C++?

有些情況下,當重載operator()不夠或者我需要虛函數或其他東西時,我必須選擇lambda上的本地類。

嗯...例如:

  1. 我需要一個捕獲局部變量的對象,並且包含多個函數,遺憾的是它們具有相同的簽名。

    • 如果函數具有不同的簽名,則重載lambdas可以解決此類問題。 我認為這是一個常見問題,因為存在lambda-overloading技巧。
  2. 我需要一個捕獲局部變量的對象,並繼承其他一些類或具有成員變量。

    • 這是java世界中每天都會發生的事情。 動態多態性有用,至少有時候。

我現在正在做的是定義一些這樣的輔助宏:

#define CAPTURE_VAL(Var) decltype(Var) Var
#define CAPTURE_REF(Var) decltype(Var) &Var
#define INIT_CAPTURE(Var) Var(Var)

並將它們放入本地課程:

struct Closure
{
    Closure(CAPTURE_VAL(var1), CAPTURE_REF(var2)) : INIT_CAPTURE(var1), INIT_CAPTURE(var2)
    {
    }

    int foo()
    {
        return some_expression;
    }

private:

    CAPTURE_VAL(var1);
    CAPTURE_REF(var2);

} closure(var1, var2);

這很難看。

我必須三次引用同一個變量。

我必須給班級一個ctor的名字。

我必須為閉包給出一個變量名,但我認為這在目前的標准下是無法幫助的。

至少在VC ++ 11中,lambda的捕獲變量是私有的,所以我不能簡單地繼承lambda類。 繼承lambda類,至少在VC ++ 11中,需要一個變量(或者可能是其他一些占位符用於評估)lambda,這很難看。


而且我想我甚至不知道標准是否允許我以這種方式捕獲本地類中的局部變量類型...

在GCC 4.6上測試,無法像在VC ++中那樣捕獲局部變量的類型。 捕獲的變量不像VC ++那樣公開。 大聲笑

啊,我的壞。 我忘了打開C ++ 11。 這在G ++上運行正常。 但是lambda類型不能被繼承,並且捕獲的變量仍然沒有被暴露。

不太好......不得不離開 - 堅持不懈。 或者G ++認為成員變量與decltype()中使用的局部變量沖突。


我一直在徘徊為什么C ++選擇了這樣一個高級別的lambda用於閉包而不是更通用的本地類來捕獲局部變量。

這不僅僅是對你的問題的簡單評論,所以我會把它作為答案。

確實有些情況下你需要別的東西,而不是簡單的仿函數或lambda。 但是這些情況是非常不同和多樣的,沒有“一刀切”的解決方案,特別是沒有適合幾行而且不會影響單一功能的范圍。
在函數內部本地創建復雜的行為在可讀性和簡單性方面不是一個好主意,並且肯定會違反該函數的SRP。
在許多情況下,如果您必須編寫多個operator() ,這意味着您將需要重用已編寫的代碼,如果它在本地類中,則無法執行。

含義:在大多數情況下,使用適當的構造函數等在函數外部編寫適當的類將是最佳解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM