如果数据类型不同,则进行条件编译

时间:2015-11-25 13:46:35

标签: c++ templates

我有一些专门针对某些数据类型的模板。现在在x64构建中,类型是不同的,所以它工作正常。对于x32构建,数据类型是相同的,所以我想知道只有在数据类型不同的情况下才能进行条件编译。

template <> const usize_t NumericColumn<int_t>::MinDefault = (usize_t)INT_MIN;
template <> const usize_t NumericColumn<int_t>::MaxDefault = (usize_t)INT_MAX;
template <> const usize_t NumericColumn<uint_t>::MinDefault = (usize_t)0;
template <> const usize_t NumericColumn<uint_t>::MaxDefault = (usize_t)UINT_MAX;

// May not work in 32 bit build, but so far we don't need this anyway and if it is
// desired, it needs to be adjusted accordingly with an ifdef WIN32/WIN64
template <> const usize_t NumericColumn<ssize_t>::MinDefault = (usize_t)LLONG_MIN;
template <> const usize_t NumericColumn<ssize_t>::MaxDefault = (usize_t)LLONG_MAX;
template <> const usize_t NumericColumn<usize_t>::MinDefault = (usize_t)0;
template <> const usize_t NumericColumn<usize_t>::MaxDefault = (usize_t)ULLONG_MAX;

在x32 usize_t中,uint_tint,因此我收到编译错误,因为模板被实例化了两次。

我可以使用

进行练习
#ifdef WIN64
    template usize_t...
#endif

但是我想知道我是否可以用C ++来比较类型本身,这将是更清洁的IMO。如果我使用static_assert我只能生成错误,这当然不是我需要的。

2 个答案:

答案 0 :(得分:2)

您需要的是标准库中已有的内容:

template <typename T>
const usize_t NumericColumn<T>::MinDefault = std::numeric_limits<T>::min();
template <typename T>
const usize_t NumericColumn<T>::MaxDefault = std::numeric_limits<T>::max();

关于你实际问过的问题,你可以使用编译时程序:

template <typename T>
const usize_t NumericColumn<T>::MinDefault = DefaultComputer<T>::min;
template <typename T>
const usize_t NumericColumn<T>::MaxDefault = DefaultComputer<T>::max;

并实施DefaultComputer作为元程序来进行所需的计算,例如:通过存储类型 - 值对列表并使第一个条目具有匹配类型。

更好的方法是根据您知道的不同类型名称进行专业化;例如假设您使用的是合适的类型,

template <typename T>
const usize_t NumericColumn<int32_t>::MinDefault = INT32_MIN;
template <typename T>
const usize_t NumericColumn<uint32_t>::MinDefault = UINT32_MIN;
template <typename T>
const usize_t NumericColumn<int64_t>::MinDefault = INT64_MIN;
template <typename T>
const usize_t NumericColumn<uint64_t>::MinDefault = UINT64_MIN;

答案 1 :(得分:1)

我认为你正在寻找这个:

enable_if<is_same<uint_t, usize_t>::value>