我想使用SIMD指令和编译器内在函数优化我的Vector和Matrix类(确切地说是类模板)。我只想针对元素类型为“float”的情况进行优化。使用SIMD指令需要触摸数据成员。由于我不想为维护两个单独的类而烦恼,我希望能够根据模板参数的类型启用/禁用某些数据成员。在适用的情况下,这种方法的另一个优点是,我可以使用与一般情况相同的代码来处理我不想编写专业化的函数。因此,我想在伪代码中实现的是:
template< typename T >
class Vector3 {
if type( T ) == float:
union {
__m128 m128;
struct {
float x, y, z, pad;
};
};
else
T x, y, z;
endif
};
我知道通过使用Boost.enable_if或类似工具可以有条件地包含成员函数。我正在寻找的是有条件地包含数据成员。一如既往,非常感谢您的帮助。其他有效建议也欢迎。
感谢。
答案 0 :(得分:4)
一个让人想到的解决方案是部分专业化的模板,这是Martin York发布的,但却有所改变。
我建议使用一个特殊的content_type-struct来提供布局类型,如下所示:
// content for non float types
template<typename T>
struct content_type {
typedef typename T member_type;
member_type x,y,z;
member_type& X { return x; }
// ...
// if access to optional members is needed, better use CT_ASSERT or similar
member_type& Pad { char assert_error_no_pad_here[0]; }
};
// content for float types
struct content_type<float> {
typedef typename float member_type;
member_type x, y, z, pad;
member_type& X { return x; }
// ...
member_type& Pad { return pad; }
};
template<typename T>
class Vector3 {
typedef typename content_type<T> layout_type;
typedef typename content_type<T>::member_type member_type;
layout_type _content;
public:
member_type& X { return _content.X(); }
memmber_type& Pad { return _content.Pad(); }
};
// or maybe, if memory layout is not important, just inherit (watch for virtual members)
template<typename T>
class Vector3 : public content_type<T> {
typedef typename content_type<T> layout_type;
typedef typename content_type<T>::member_type member_type;
};
优点是你只需要用它的所有逻辑写一次Vector3。
你需要一个适度的近期编译器才能正确地做到这一点(MSVC&gt; 7,gcc&gt; 3)