gpt4 book ai didi

c++ - 使用 enable_if 检查成员是否存在

转载 作者:IT老高 更新时间:2023-10-28 12:47:59 25 4
gpt4 key购买 nike

这是我想要做的:

template <typename T> struct Model
{
vector<T> vertices ;

#if T has a .normal member
void transform( Matrix m )
{
each vertex in vertices
{
vertex.pos = m * vertex.pos ;
vertex.normal = m * vertex.normal ;
}
}
#endif

#if T has NO .normal member
void transform( Matrix m )
{
each vertex in vertices
{
vertex.pos = m * vertex.pos ;
}
}
#endif
} ;

我见过 examples使用 enable_if,但我不明白如何将 enable_if 应用于此问题,或者是否可以应用。

最佳答案

这在 C++11 中变得方式更容易了。

template <typename T> struct Model
{
vector<T> vertices;

void transform( Matrix m )
{
for(auto &&vertex : vertices)
{
vertex.pos = m * vertex.pos;
modifyNormal(vertex, m, special_());
}
}

private:

struct general_ {};
struct special_ : general_ {};
template<typename> struct int_ { typedef int type; };

template<typename Lhs, typename Rhs,
typename int_<decltype(Lhs::normal)>::type = 0>
void modifyNormal(Lhs &&lhs, Rhs &&rhs, special_) {
lhs.normal = rhs * lhs.normal;
}

template<typename Lhs, typename Rhs>
void modifyNormal(Lhs &&lhs, Rhs &&rhs, general_) {
// do nothing
}
};

注意事项:

  • 您可以在 decltypesizeof 中命名非静态数据成员,而无需对象。
  • 您可以申请扩展 SFINAE。基本上可以检查任何表达式,如果在替换参数时它无效,则忽略模板。

关于c++ - 使用 enable_if 检查成员是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786888/

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