Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板的条件typedef的更干净的替代方案_C++_Templates - Fatal编程技术网

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;