私はhereのようなコードを書こうとしていますが、BoostなしではC++ 11の機能を使用しています。タイプ形質を使用して条件付きコンパイルを行うにはどうすればよいですか?
this exampleから作業すると、response_trait
を定義し、その結果のベース条件付きコンパイルを試みました。どうすればこの作品を作れますか?
#include <vector>
using namespace std ;
struct Vector{ float x,y,z ; } ;
struct Vertex { Vector pos ; } ;
struct VertexN { Vector pos, normal ; } ;
struct Matrix {} ;
template <typename T>
struct response_trait {
static bool const has_normal = false;
} ;
template <>
struct response_trait<VertexN> {
static bool const has_normal = true;
} ;
template <typename T>
struct Model
{
vector<T> verts ;
void transform(Matrix m)
{
for(int i = 0 ; i < verts.size() ; i++)
{
#if response_trait<T>::has_normal==true
puts("Has normal") ;
// will choke compiler if T doesn't have .normal member
printf("normal = %f %f %f\n", verts[i].normal.x, verts[i].normal.y, verts[i].normal.z) ;
#else
puts("Doesn't have normal") ;
printf("pos = %f %f %f\n", verts[i].pos.x, verts[i].pos.y, verts[i].pos.z) ;
#endif
}
}
} ;
int main()
{
Matrix m ;
Model<Vertex> model ;
model.verts.push_back(Vertex()) ;
model.transform(m) ;
Model<VertexN> modelNormal ;
modelNormal.verts.push_back(VertexN()) ;
modelNormal.transform(m) ;
}
質問を自己完結し、達成しようとしていることを説明してください。 –
自己完結型です。 '#if'' T'は '.normal'メンバーを持ち、' response_trait'' has_normal'は真でなければならず、正しいコンパイルパスを選ぶべきです。 – bobobobo
私が完全に型の形質を誤解していない限り。リンクされた質問は私の出発点でしたが、私はそれを間違った方法で取ったかどうかわかりません。 – bobobobo