C++ 使用模板的条件typedef的更干净的替代方案
在使用一些模板时,为了删除代码中的一些宏,我使用了以下代码:C++ 使用模板的条件typedef的更干净的替代方案,c++,templates,C++,Templates,在使用一些模板时,为了删除代码中的一些宏,我使用了以下代码: typedef std::conditional<sizeof(int) == sizeof(void*), int, std::conditional<sizeof(long int) == sizeof(void*), long int, std::enable_if<sizeof(long long int) == sizeof(void*), long long
typedef std::conditional<sizeof(int) == sizeof(void*),
int,
std::conditional<sizeof(long int) == sizeof(void*),
long int,
std::enable_if<sizeof(long long int) == sizeof(void*), long long int>::type
>::type
>::type Int;
typedef std::conditional<sizeof(unsigned int) == sizeof(Int),
unsigned int,
std::conditional<sizeof(unsigned long int) == sizeof(Int),
unsigned long int,
std::enable_if<sizeof(unsigned long long int) == sizeof(Int), unsigned long long int>::type
>::type
>::type UInt;
你能想出一个使用模板的更干净、更短的替代方案吗?或者使用模板替换所有可能的宏是一个坏主意
顺便说一句,该代码用于将整数值传递给一些只接受
void*
的C函数,开销最小。也许别名可以帮助您:
using Int = best<int,best<long int,long long>>;
using UInt = best<unsigned int,best<unsigned long int,unsigned long long int>>;
请注意,我不确定这是否解决了您的问题,但如果您抱怨的是冗长的模板,那么上述技术可能会让您了解如何使模板变得更短、更干净
如果您有C++14,则可以使用\u t
版本:
template<typename T, typename U>
using best = std::conditional_t<sizeof(T)==sizeof(void*),T,U>;
模板
使用best=std::conditional\u t;
希望能有所帮助。对于这项特殊任务,您似乎希望(大致):
我不知道什么是<代码> Enable,如果在那里做?你能给我们举个例子来说明它是如何在C函数中使用的吗?这很好,但是我将更进一步,建议直接使用原始<代码> FooPtRyt类型,而不是将它们隐藏在TyPulf后面。@但是,如果他有大量的代码已经使用了他的
Int
/UInt
类型,那么可能需要做大量额外的工作,但实际的好处很小。
template<typename T, typename U>
using best = typename std::conditional<sizeof(T)==sizeof(void*),T,U>::type;
template<typename T, typename U>
using best = std::conditional_t<sizeof(T)==sizeof(void*),T,U>;
typedef intptr_t Int;
typedef uintptr_t UInt;