如何在32位和64位环境中使用intptr_t可靠地专门化模板?

时间:2010-05-25 10:15:12

标签: c++ templates 64-bit 32-bit

我有一个模板,我想专门研究两种int类型,其中一种是普通的int,另一种是intptr_t。在64位平台上,它们具有不同的大小,我可以轻松地做到这一点,但在32位上,两种类型都是相同的,编译器会抛出有关重新定义的错误。除了使用预处理器禁用其中一个定义外,我该怎么做才能解决它?

以某些代码为例:

template<typename T>
type * convert();

template<>
type * convert<int>() { return getProperIntType(sizeof(int)); }

template<>
type * convert<intptr_t>() { return getProperIntType(sizeof(intptr_t)); }

//this template can be specialized with non-integral types as well, 
// so I can't just use sizeof() as template parameter.
template<>
type * convert<void>() { return getProperVoidType(); }

1 个答案:

答案 0 :(得分:2)

你想要实现的是根本不可能的:intptr_t是32位系统上int的typedef,因此编译器无法区分它们。但是,您的示例可以通过专门处理void case来解决:

template<typename T>
type * convert() { return getProperIntType(sizeof(T)); }

template<>
type * convert<void>() { return getProperVoidType(); }