簡體   English   中英

C ++模板:查詢哪個更好的使用方式和原因

[英]C++ templates: Query regarding which is better of way of using and why

我有一個問題。 這樣做更好。

typedef enum{
  One = 1,
  Two = 2
} Number;

template< typename T, Number num >
void foo( const T& param )
{
}

or 

template< typename T >
void foo( const T& param, Number num )
{
}

基本上我在尋找的是,這兩種方法有何不同? 如果我必須使用其中任何一個我應該選擇哪個以及為什么?

這真的取決於你想做什么。 如果num值是模板參數,則必須在編譯時指定它。 如果它是一個函數參數,那么可以在運行時指定它。

你的用例是什么?

這是您希望了解的代碼清潔度問題。 假設用戶輸入選項。 所以你有一些變量Number x ,可能是OneTwo 如果你想調用foo() ,你需要做...

if (x == One)
    foo<const char *, One>("asd");
else
    foo<const char *, Two>("asd");

如果您使用替代方式(您的建議編號為2),您可以簡單地執行以下操作:

foo<const char *>("asd", x);

現在,如果在這個函數中,將那些可能的分支優化出來是非常有益的,那么肯定。 但除此之外,我認為你只會讓自己的生活變得困難。


另外,關於這些方法如何不同。 在我上面編寫的代碼中,我引用了三個不同的函數。 在最后一個模板參數中,只有一個模板參數,為該函數生成的代碼將包括兩個代碼路徑,當num == Onenum == Two 然而,前兩個模板化方法將能夠刪除這些分支。 它可以這樣做,因為它將在內存中構建兩個不同的代碼路徑,每種情況一個。

我會去第二,除非foo()對性能至關重要,因為我覺得它更清晰。

至於差異:

第一個將編譯為不同的版本,用於不同的Number值。 這可能允許編譯器根據num的使用方式進行更多優化。

第二個將只有不同的T版本,並將在運行時選擇不同的num

第一個可能稍微快一點,但第二個會產生更少的代碼(根據內存壓力可能會更快)。

暫無
暫無

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

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