2017-10-30 9 views
0

コンパイル時定数に基づいて関数にコードを含めたいのですが、static_ifはC++の構文ではありません。if文コンパイル時のconst値

だから私はこの

class TA { 
public: 
    template<bool flag> 
    void func() { 
     if(flag) 
      a++; 
    } 

    int a; 
}; 


int main() { 
    TA a; 
    a.func<true>(); 
    a.func<false>(); 
} 

のような関数を書くことができると私は、コンパイラは2つの機能を作る保証を持っていると思います。 1つは 'if(flag)a ++'が関数にコンパイルされ、もう1つはコンパイルされない関数です。

この保証は、C++ 17標準に基づいて取得することはできますか、コンパイラベンダーの助けを借りてですか?

ありがとうございました。

+0

テンプレートのインスタンス化は、常に独立した関数です。あなたは 'TA :: func 'が 'a ++'コードを含んでいますが、常にスキップしてしまうのではないかと心配していますか? – aschepler

+0

最適化はそれを考慮する必要がありますが、実際にはテンプレートを特化し、ブール値(真、偽)ごとにテンプレートを上書きすることができるのは2つだけなので、実行可能です。しかし、もう一度...あなたはすべきではない早すぎる最適化のように聞こえます。 –

答えて

3

実際には、C++ 17にはあなたが求めているものが含まれています。それはif constexprです。

あなたの条件は(そのようなテンプレートのインスタンス化など)、コンパイル時に評価することができますどこにでも使用することができます。

class TA { 
public: 
    template<bool flag> 
    void func() { 
     if constexpr (flag) 
      a++; 
    } 

    int a; 
}; 

しかし、他の人はあなたができるだけ多くを獲得しそうだ、この例では、述べてきたようにコンパイラはしばしばこのようなものを最適化できます。

+0

'if constexpr'?ニース! – Timo

+0

@Timo Yep!また、(C++ 11以降の)変数を宣言するときに 'constexpr'を使うこともできますし、' constexpr bool c = true; a.func (); ' - ' constexpr'がなくても 'c'として失敗すると、コンパイル時には分かりません。 – Steve

+0

ええ、私はすでにそれを知っていた。しかし、if文は私にとって初めてのものでした。そして私はその機能が本当に好きです。 – Timo

関連する問題