gpt4 book ai didi

c++ - 完美的前向返回类型,但带有 const

转载 作者:行者123 更新时间:2023-12-03 06:54:24 25 4
gpt4 key购买 nike

我想完美转发对函数的调用,但我总是想返回返回类型的 const 版本。我的意思是,当返回一个引用时,我想要一个 const& 来代替。我怎样才能做到这一点?

  • 我不关心非引用类型。毕竟,返回一个 const T(没有引用)与 T 没有太大区别。
  • 我只关心顶层的const。如果 T 是指针类型或其他更复杂的类型,我不想在更深的地方添加常量。

如果我只是正常转接电话:

template<class Func, class... Args>
decltype(auto) Example(Func f, Args&&... args)
{
return fun(std::forward<Args>(args)...);
}

f 碰巧返回,比方说,int& 然后我就得到了:int&。但我想得到一个 const int&

decltype(auto) constdecltype(auto const) 似乎是非法的。

最佳答案

这是一个可能的解决方案。引用被转换为 const&。任何其他类型保持不变。但是,如果有一些我没有考虑的极端情况,我想听听第二意见。

#include <utility>

template<typename T>
struct add_const_to_ref {
using type = T;
};

template<typename T>
struct add_const_to_ref<T&> {
using type = const T&;
};

template<typename T>
using add_const_to_ref_t = typename add_const_to_ref<T>::type;

template<class Func, class... Args>
add_const_to_ref_t<decltype(std::declval<Func>()(std::forward<Args>(std::declval<Args&&>())...))> ConstInvoke(Func f, Args&&... args)
{
return f(std::forward<Args>(args)...);
}

下面的测试:

#include <iostream>

int& foo(int& x) {
return x;
}

int bar() {
return 5;
}
int main() {
int x = 0;
std::cout << std::is_same_v<int&, decltype(ConstInvoke(foo, x))> << "\n";
std::cout << std::is_same_v<int, decltype(ConstInvoke(foo, x))> << "\n";
std::cout << std::is_same_v<const int&, decltype(ConstInvoke(foo, x))> << "\n";

std::cout << std::is_same_v<int&, decltype(ConstInvoke(bar))> << "\n";
std::cout << std::is_same_v<int, decltype(ConstInvoke(bar))> << "\n";
std::cout << std::is_same_v<const int&, decltype(ConstInvoke(bar))> << "\n";
};

给出预期的结果:

001个01个0

ConstInvoke(foo, x) 返回 const int&,

ConstInvoke(bar) 返回 int


另一种方法是简化可怕的 ConstInvoke,可以这样尝试:

template<typename T>
decltype(auto) as_const_to_ref(T&& arg) {
return (add_const_to_ref_t<T>)(std::forward<T>(arg));
}

template<class Func, class... Args>
decltype(auto) ConstInvoke2(Func f, Args&&... args)
{
return as_const_to_ref(f(std::forward<Args>(args)...));
}

关于c++ - 完美的前向返回类型,但带有 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64516031/

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