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
,但不删除两个第一个构造函数中的任何一个(并且不会使它们隐式).
就像是
#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_t
是int
,则永远不会使用激活的函数,因为它永远不会比具有相同签名的非模板函数更好的匹配。如果ptrint_t
不是int
,那么当参数具有 type 时,模板实例化将更匹配
int
。(请注意,我自己从未尝试过:这对我来说听起来应该是可能的,但我不太熟悉boost::enable_if
。)
归档时间: |
|
查看次数: |
433 次 |
最近记录: |