gpt4 book ai didi

c++ - 删除 decltype 中的引用(返回 T 而不是 T&,其中 T& 是 decltype)

转载 作者:IT老高 更新时间:2023-10-28 14:00:02 35 4
gpt4 key购买 nike

(如果您是 C++11 专业人士,请跳至粗体段落。)

假设我想编写一个模板方法,该方法调用并返回传递的对象的结果,该对象的类型是模板参数:

template<ReturnType, T>
ReturnType doSomething(const T & foo) {
return foo.bar(); // EDIT: Might also be an expression introducing a temp val
}

所以 T必须有方法ReturnType T::bar() const为了在这样的调用中使用:

struct MyClass {
...
int bar() const;
...
};
...
MyClass object;
int x = doSomething<int, MyClass>(object);

我们不必写 MyClass由于类型推导,调用变为:

int x = doSomething<int>(object);

但省略了 <int>也会导致编译错误,因为该方法不需要返回 int 即可分配给 x。之后(例如,它可以返回 char)。

在 C++0x/11 中,我们有 autodecltype我们可以用它来推断模板方法的返回类型:

template<T>
auto doSomething(const T & foo) -> decltype(foo.bar()) {
return foo.bar(); // EDIT: Might also be an expression introducing a temp val
}

编译器现在将找出 foo.bar() 的类型。是并且只是使用它作为返回类型。与我们的具体类(class) MyClass这将是 int以下内容就足够了:

int x = doSomething(object);

现在我的问题是:

如果 MyClass 定义了 bar()作为返回 int& ,返回类型为doSomething(object)也将是 int& = decltype(foo.bar()) .这是一个问题,因为 G++ 现在符合我返回对临时的引用

我该如何解决这个问题?有没有类似 remove_reference 的东西可以像 remove_reference(decltype(foo.bar())) 这样使用?

我想过只声明一个辅助方法,它采用 T&并返回 T然后定义doSomething的返回类型成为 decltype(helper(foo.bar())) .但必须有更好的方法,我感觉到了。

最佳答案

要删除引用:

#include <type_traits>

static_assert(std::is_same<int, std::remove_reference<int&>::type>::value, "wat");

在你的情况下:

template <typename T>
auto doSomething(const T& foo)
-> typename std::remove_reference<decltype(foo.bar())>::type
{
return foo.bar();
}

为了清楚起见,请注意,返回引用就可以了:

#include <type_traits>

struct f
{
int& bar() const
{
static int i = 0;
return i;
}
};

template <typename T>
auto doSomething(const T& foo)
-> decltype(foo.bar())
{
return foo.bar();
}

int main()
{
f x;
return doSomething(x);
}

返回的引用可以简单地传递而不会出错。您在评论中的示例变得重要且有用:

template <typename T>
auto doSomething(const T& foo)
-> decltype(foo.bar())
{
return foo.bar() + 1; // oops
}

关于c++ - 删除 decltype 中的引用(返回 T 而不是 T&,其中 T& 是 decltype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13202289/

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