条件文が真であれば "コンパイル"しかできない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);
}
つのオプション: 'のstd :: enable_if'(C + (if + constexpr)(C++ 17) – Jonas
@Jonasありがとう、 'if-constexpr'は非常にきれいなソリューションのように見えます。 – Matthias
はい、 'if-constexpr'があなたの例で(あなたのコンパイラがそれをサポートしているなら)行く方法です。これが追加された理由の1つです。 – Jonas