簡體   English   中英

在函數內定義結構是否有任何“懲罰”?

[英]Are there any "penalties" for defining a struct inside a function?

只是出於好奇..

正如標題所說:在函數內部定義結構是否有任何“懲罰”? (比如性能、內存、糟糕的編程習慣等)


PS 我知道,在函數內部定義(非模板)仿函數是一種常見的做法,但仍然..)

在C ++ 11中,沒有 - 沒有懲罰。 我甚至認為這是一個非常好的風格,不會污染任何“更明顯”的范圍與您的實現細節,當然,除非您想在其他地方重用該仿函數。 但是, lambdas本質上是這個想法的濃縮形式,如果你只是使用struct作為functor, 通常應該是首選 對於所有類型的數據,它完全沒問題,盡管它通常在這方面與std::pairstd::tuple競爭。

在C ++ 03中,您不能使用這樣的結構作為模板參數,因為這些參數需要具有外部鏈接(盡管Visual Studio允許您這樣做)。 使用具有多態接口的這種結構仍然是有用的。

由於它純粹是一個可見性問題,我無法想象會出現性能或內存損失的合理情況。

如果您正在使用C ++ 03,那么從技術上講,您不能使用本地定義的結構作為模板參數,但某些編譯器(即MSVC)允許它。

我知道你問過性能,但我想知道另一個問題。 你要求C和C ++還是其中一種語言? 我猜想你想在函數中定義一個結構以達到范圍或隱藏結構。

對於C,您可以通過在單獨的模塊中定義和聲明結構並使其成為靜態來隱藏事物。 然后,您可以提供訪問功能,就像您對C ++類的成員一樣。 您可以在.h文件中包含需要訪問結構的模塊的函數聲明。

如果這是用於C ++,那么創建一個類並使結構保持私有或受到保護以及編寫適當的get / set / manipulate方法可以完成剩下的工作。

如果您編輯了原始帖子並擴展了原因,那么您就提出了一個很好的問題。

如果某些成員函數基於編譯時約束不可調用,則不能使用本地定義的結構來創建模板化類型的對象。

例子:

template<typename T>
concept C = requires(T t) { { t.unsupported() }; };

template <typename T>
struct X {
    void unsupported() { static_assert(std::is_void_v<T>); }
};
static_assert(C<X<int>>);

template <typename T>
C auto make()
{
    struct Y {
        void unsupported() { static_assert(std::is_void_v<T>); }
    };
    return Y{};
}

int main()
{
    C auto x = X<int>{};      // compiles fine
    C auto y = make<int>();   // error: static assertion failed
    return 0;
}

暫無
暫無

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

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