gpt4 book ai didi

c++ - 你如何使用类型特征来进行条件编译?

转载 作者:可可西里 更新时间:2023-11-01 16:29:55 25 4
gpt4 key购买 nike

我正在尝试编写类似 here 的代码但使用 C++11 特性,没有 Boost。

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 ) ;
}

最佳答案

你可以尝试这样的事情:

void transform_impl(Matrix const & m, std::true_type const &)
{
// has normal
}

void transform_impl(Matrix const & m, std::false_type const &)
{
// doesn't have normal
}

template <typename T>
void transform(Matrix const & m)
{
transform_impl(m, response_trait<T>());
}

你只需要稍微修改一下你的特质:

#include <type_traits>
template <typename> struct response_trait : std::false_type { };
template <> struct response_trait<VertexN> : std::true_type { };

关于c++ - 你如何使用类型特征来进行条件编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13787490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com