如何检查类型是否为int的typedef

Pie*_*BdR 5 c++ constructor typedef c-preprocessor

在C++中,我想要一个类,其构造函数如下:

class A {
  explicit A(A* other) { ... }
  explicit A(intptr_t other) { ... }
};
Run Code Online (Sandbox Code Playgroud)

这个问题是用户初始化时

A a(0);
Run Code Online (Sandbox Code Playgroud)

然后,在64位系统上,编译器会抱怨它不知道是否0应该转换为A*或者intptr_t,这是公平的.因为我想要这个简单的符号工作,我添加了以下构造函数:

explicit A(int a) { assert(a==0); ... }
Run Code Online (Sandbox Code Playgroud)

断言是因为这是唯一有意义的整数.现在,问题出现在32位系统中,intptr_t实际上...... int!所以现在,系统抱怨有两个构造函数采用相同的参数类型(这又是公平的).

所以我的问题是:有没有办法让预处理器检测到intptr_t实际上是这样int,在这种情况下,不用编译构造函数int.或者,是否有另一种方法可以在A a(0)不添加构造函数的情况下使符号有效int,但不删除两个第一个构造函数中的任何一个(并且不会使它们隐式).

Jam*_*nze 3

就像是

#if INTPTR_MAX == INT_MAX
Run Code Online (Sandbox Code Playgroud)

可能会成功,但它仍然会导致 true,其中long和 的 int大小相同,并且ptrint_t是 的 typedef long。另一种可能性(但不知道是否可以使用它)是使用uintptr_t, 而不是intptr_t

除此之外:预处理器不知道类型,因此问题无法在那里解决。您必须使用某种元编程技巧:将int构造函数设为模板, boost::enable_if仅当参数具有 type 时才激活它int。如果ptrint_tint,则永远不会使用激活的函数,因为它永远不会比具有相同签名的非模板函数更好的匹配。如果ptrint_t不是int,那么当参数具有 type 时,模板实例化将更匹配 int。(请注意,我自己从未尝试过:这对我来说听起来应该是可能的,但我不太熟悉boost::enable_if。)