2017-02-07 6 views
2

条件文が真であれば "コンパイル"しかできないC++テンプレートで条件文を使用できますか?そうでなければ "コンパイル" (ただし、コンパイラはコードを必要としないと判断していますので、とにかく含まれません)。条件文に基づいてコンパイラに含めることができるC++テンプレートの条件文

たとえば、テンプレートのインスタンス化Aにはkという名前のメンバーがないため、以下のコードはコンパイルされません。しかし、コードのその部分は実際にはテンプレートインスタンス化Aのデッドコードです。

(この問題の実際の使用例:メッシュを読み込むために複数の頂点タイプをサポートしたいと思います)頂点タイプによっては、メッシュファイルで特定の情報がスキップされたりインデックスされたりしません。異なる)。

#include <iostream> 

struct A { 
    static constexpr bool value = false; 
}; 

template < typename T > 
inline bool f(const T &t) { 
    if (T::value) { 
     return t.k; // error: 'const struct A' has no member named 'k' 
    } 
    else { 
    return true; 
    } 
} 

int main() { 
    A a; 
    std::cout << f(a); 
} 
+2

つのオプション: 'のstd :: enable_if'(C + (if + constexpr)(C++ 17) – Jonas

+0

@Jonasありがとう、 'if-constexpr'は非常にきれいなソリューションのように見えます。 – Matthias

+0

はい、 'if-constexpr'があなたの例で(あなたのコンパイラがそれをサポートしているなら)行く方法です。これが追加された理由の1つです。 – Jonas

答えて

4

ここには2つのオプションがあります。

あなたがそうのようなテンプレートの特殊化を使用することができます。

template < typename T > 
inline bool f(const T &t) { 
    if (T::value) { 
     return t.k; 
    } 
    else { 
     return true; 
    } 
} 

template <> 
inline bool f<A>(const A &t) { 
    return true; 
} 

あなたはとても似if-constexpr(C++ 17)を使用することができます。

template < typename T > 
inline bool f(const T &t) { 
    if constexpr (T::value) { 
     return t.k; 
    } 
    else { 
     return true; 
    } 
} 
+0

最初の解決策は、実際にはこの例では正しいですが、私のユースケースでは、完全なボディを含むので、コードの重複が多すぎます。 – Matthias

+0

私はそのように思っていましたが、これは 'if-constexpr'が追加された多くの理由の1つです。 – Jonas

関連する問題