gpt4 book ai didi

c++ - 如何使用 decltype 获取引用的类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:35 25 4
gpt4 key购买 nike

我正在 CodeGear RAD Studio 中使用 decltype 编写一些代码。我已经尝试过天真的解决方案,看起来与此不同:

int main(int, char**) {
int i;
int &ir = i;
decltype((ir)) ir_clone = ir;
}

当然,编译失败:Internal Compiler Error。我宁愿怀疑该代码没有什么特别的错误,并且存在关于引用表达式的编译器错误。 (顺便说一下,g++ 的代码没有问题并且编译得很好。)但是,这无助于解决问题,因为平台是不可协商的。

如果我在上面写了

    decltype(ir) ir_clone = ir; /* No extra parens */

它按预期编译和工作。然而,问题并没有就此结束,因为它不能正确计算环境的常量。特别是:

struct S { int i; } s;
const S* p = &s;
decltype(p->i) i0 = s.i; /* i0 is an int */
decltype((p->i)) i1 = s.i; /* i1 is a const int& */

如果我不使用括号使参数成为表达式,我将失去参数的常量性,而这正是我所需要的。

我可以使用的另一个工具是简单的模板,如下所示:

template<class T> struct unref     { typedef T type; }
template<class T> struct unref<T&> { typedef T type; }

这让我可以通过使用 unref<int&>::type 去除类型的引用部分.

我似乎无法弄清楚的是如何将所有这些工具组合在一起,以成功表达我需要的类型。对于我需要的一件事,我正在开发一个执行“foreach”的通用宏。 (是的,我知道 Boost 做得更好。)它需要处理以下场景:

(vector<int>) vi          => vector<int>
(vector<int>&)vir => vector<int>
(const vector<int>) cvi => const vector<int>
(const vector<int>&)cvir => const vector<int>
(const P*) cp->vi => const vector<int>
(P*) p->vi => vector<int>

到目前为止,我的简单尝试都失败了:

unref<decltype(cp->vi)>   /* is vector<int>, not what I need. */
unref<decltype((cp->vi))> /* is const vector<int>, which is right. */

unref<decltype(vir)> /* is vector<int>, which is right. */
unref<decltype((vir))> /* Internal Compiler Error, which is a headache. */

有什么想法可以让我走上正轨吗?希望我缺少一些简单的东西。也许我从错误的角度解决了这个问题。

最佳答案

尝试创建一个不同的、更复杂的表达式来生成您想要的相同类型,例如:

decltype((void(), ir))

我无法告诉您它为什么会修复它,但有时不同的表达方式就可以解决问题。

关于c++ - 如何使用 decltype 获取引用的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970959/

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