I次のコードを持っている:コンパイル時のコード生成
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++には回避策がありますか?サイズがゼロの場合ARGS...
の大きさは、しかし、0よりも大きい場合
template <typename T, typename ... ARGS>
std::enable_if_t<(sizeof...(ARGS)>0)> func(...) { ... }
この場合、func
だけ過負荷セットの一部として表示されます、あなたは:あなたは常にstd::enable_if
を使用することができます
"sizeof ...(args)== 0'の場合にコンパイラがコードを生成しないようにする"(最適化された)バージョンがコードを生成する場合は、ベンダーにバグを報告してください。 –
申し訳ありませんが、デバッグ設定のコードを生成しました。 –
多型ラムダを使用して、ある種のインラインタグディスパッチを実現できます。[example](http://coliru.stacked-crooked.com/a/616a698807b2148f)。 [生成されたコード](https://godbolt.org/g/20EFoS)を見ると、-O0であっても、決して撮られなかった「分岐」は表示されません。私は人間の読者とコンパイラの両方が普通のタグのディスパッチやSFINAEのアプローチで簡単な時間を持っていると想像していますが、 – melak47