2016-04-25 126 views
-3

我有以下的代碼:編譯時代碼生成

template<typename T, typename... args> 
void func(const my_type<T, args...>& set, std::ofstream t_print, std::ofstream args_print) { 
     t_print << set.get_t() << std::endl; 

     if (sizeof...(args) > 0) 
      data << set.get_args() << std::endl; 
    } 
} 

if條件評價是推遲到運行時間,並且編譯器對身體產生的代碼的if。我的問題是,如果有辦法讓編譯器在sizeof...(args) == 0的情況下不生成代碼,而不使用模板專門化技術。現代C++中有沒有解決方法?

+0

「使得編譯器在sizeof ...(args)== 0'的情況下不生成代碼」如果(優化的)版本爲此生成代碼,請向供應商提交錯誤。 –

+0

對不起,我生成了調試配置的代碼。 –

+0

你*可以*使用多態lambda表達式實現某種內聯標籤分派:[example](http://coliru.stacked-crooked.com/a/616a698807b2148f)。如果您查看[生成的代碼](https://godbolt.org/g/20EFoS),即使在-O0,也不會出現從未採取的「分支」。雖然我認爲人類閱讀器和編譯器都可以通過常規標籤發送或SFINAE方法輕鬆實現:) – melak47

回答

1

您可以隨時使用std::enable_if

template <typename T, typename ... ARGS> 
std::enable_if_t<(sizeof...(ARGS)>0)> func(...) { ... } 

在這種情況下,func只會出現設置過載的部分如果ARGS...的大小大於0。但是,如果大小爲零,你將會丟失超載設置的功能。不過,也許這就是你想要的。

+0

當ARGS ...的大小爲0時,我將不得不添加一個過載情況,這正是我所知詢問是否可以避免,即使是新的C++標準。正如T.C.在優化版本中,編譯器不會生成那部分代碼。 –

+0

是的,您需要指定一個可以處理有效用例的重載集。或者/你需要依靠編譯時優化。兩者都完全可以接受,並且是生成優化代碼的不同方式。 Modern C++提供了更簡單的方法來實現前者,但它並沒有消除函數定義必須可用於調用它的參數的基本需求。 – KyleKnoepfel

1

有一個務實的,不模糊的伎倆這一點,這包括具有包只是後來

template<typename T, typename arg, typename... args> 
void func(const my_type<T, arg, args...>& set, std::ofstream t_print, std::ofstream args_print) { 
    t_print << set.get_t() << std::endl; 
    data << set.get_args() << std::endl; 
} 

但是如果你考慮這樣做,作爲「優化」,只是馬上停止。那麼你應該也擔心你使用C++並直接在程序集中編程。哦,停下來,首先應該閱讀英特爾開發人員手冊,以便比編譯器的代碼生成更好地瞭解您的CPU,這樣才能獲得回報。

底線 - 不要擔心在這個級別的表現。 「未啓用優化」並不意味着「啞代碼生成」。即使禁用了優化,任何半面編譯器也不會發出if(0) ...