gpt4 book ai didi

c++ - 如何使用需要非常量引用的函数编写 decltype 表达式?

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

考虑:

int convert_it(std::string& x)
{
return 5;
}

void takes_int_ref(int& i)
{
}

我想编写一个函数,它仅在可以应用 convert_it 并将结果传递给 takes_int_ref 时才存在。即函数体为:

template <typename A>
void doit(A& a)
{
int i = convert_it(a);
takes_int_ref(i);
}

但是,如果我这样做:

template <typename A>
auto doit(A& a) -> decltype(takes_int_ref(convert_it(a)), void())

它不起作用,因为从“int”类型的右值初始化“int&”类型的非常量引用无效

我想到了以下有效的解决方案:

template <typename T>
T& gimme_ref(T t) { throw std::runtime_error("No"); return t; }

template <typename A>
auto doit(A& a) -> decltype(takes_int_ref(gimme_ref(convert_it(a))), void())

但是,它看起来有点老套,decltype 不再反射(reflect)函数体的作用。本质上问题似乎是 decltype 只接受一个表达式,而这里的函数体中需要两个语句。

在这里采取什么方法才是正确的?

最佳答案

使用 std::declval :

template <typename A>
auto doit(A& a) -> decltype(
takes_int_ref(std::declval<
decltype(convert_it(std::declval<A&>()))
&>()), void())
{ .. }

std::declval<A&>()给你一个 A& 类型的表达式. convert_it(A&)要么有效,要么无效——如果无效,你就失败了。如果有效,则说它的类型为 T .然后,您尝试调用 takes_int_refT& ,所以看看那个是否有效。如果是,您将到达 void .如果不是,替换失败。

关于c++ - 如何使用需要非常量引用的函数编写 decltype 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30785457/

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