【发布时间】:2014-06-17 13:10:45
【问题描述】:
我如何在编译时检查模板参数是否具有特定的枚举,如果是,则获取该枚举值。
我正在为模板参数T 寻找类似的东西,它可能(或可能没有)具有枚举类型NeedsToAlign:
compile_time_if (T has NeedToAlign) {
// only then compile the following
EIGEN_MAKE_ALIGNED_OPERATOR_IF(typename T::NeedToAlign)
}
继续阅读以了解我的实际问题:
所以我有一个名为Payload 的类,它定义了一个枚举NeedsToAlign,如下所示:
struct Payload<int N> {
typedef Eigen::Matrix<float, N, 1> DataType;
DataType data;
enum {
NeedToAlign = (sizeof(DataType)%16)==0, ///< Check for alignement need
};
EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(EigenNeedsToAlign)
};
虽然与我的实际问题无关,但对于某些固定大小的DataType,使用Eigen library to generates aligned pointers 需要EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF() 宏。
现在假设我有另一个模板类,它只存储 T 类型的变量,它可能是 Payload 类型或更简单的类型,例如 int/float 等。
template <typename T>
class A {
T value;
// My goal:
// if T is of type Payload we need to enable the following:
// EIGEN_MAKE_ALIGNED_OPERATOR_IF(T::NeedToAlign)
};
请注意,我不能简单地使用 EIGEN_MAKE_ALIGNED_OPERATOR_IF(typename T::NeedToAlign),因为我希望 class A 也可以使用 say T = int 进行编译。
是否有针对这些的 Boost MPL 解决方案?这是我到目前为止所能想到的:
typedef typename boost::mpl::if_<
has_EigenNeedsToAlign<Payload>,
typename Payload::NeedToAlign,
boost::mpl::int_< 0 >
>::type result;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(result::value);
但对于T = int 类型,上述方法当然会失败。
我可以看到解决方案的一种方法是对具有 T::NeedToAlign 的 Payload 类型或 T 类型的 A 类进行某种部分特化。但是有没有一种 Boost MPL 方法可以做到这一点?
您可能已经知道,我对此很陌生。
更新1:
我想出了一种方法,即通过如下方式派生 A 类:
template <typename T>
class A : public EigenAllocatorHelper<T>{
T value;
....
};
EigenAllocatorHelper 通过部分特化注入适当的行为(如下所示):
template<typename T, class Enable = void>
class EigenAllocatorHelper {
};
BOOST_MPL_HAS_XXX_TRAIT_DEF(NeedsToAlignMPL)
template< typename T >
class EigenAllocatorHelper< T, typename boost::enable_if< has_NeedsToAlignMPL<T> >::type > {
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(typename T::NeedsToAlign);
};
我还必须使用typedef boost::mpl::int_<(sizeof(DataType)%16)==0> NeedToAlignMPL;,因为当我使用简单枚举时mpl has_xxx 不起作用。
这个解决方案对我来说看起来不错,事实上我也可以在其他地方重用这个 EigenAllocatorHelper 类。但如果有更好的 MPL 魔法不需要这个,请告诉我。
【问题讨论】:
标签: c++ templates boost eigen boost-mpl