我有一些专门针对某些数据类型的模板。现在在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_t
是int
,因此我收到编译错误,因为模板被实例化了两次。
我可以使用
进行练习#ifdef WIN64
template usize_t...
#endif
但是我想知道我是否可以用C ++来比较类型本身,这将是更清洁的IMO。如果我使用static_assert
我只能生成错误,这当然不是我需要的。
答案 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>