gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:37 24 4
gpt4 key购买 nike

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

class A {
explicit A(A* other) { ... }
explicit A(intptr_t other) { ... }
};

这个问题是如果用户初始化

A a(0);

然后,在 64 位系统上,编译器会提示它不知道 0 应该转换为 A* 还是 intptr_t,这很公平。因为我想让这个简单的符号起作用,所以我添加了以下构造函数:

explicit A(int a) { assert(a==0); ... }

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

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

最佳答案

有点像

#if INTPTR_MAX == INT_MAX

可能会成功,但在 longint 大小相同,ptrint_tlong 的类型定义。另一种可能(但不知道能不能用)将使用 uintptr_t,而不是 intptr_t

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

关于c++ - 如何检查类型是否为 int 的 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8486216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com