gpt4 book ai didi

c++ - 有什么方法可以匹配 C++11 中的返回值吗?

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

我正在尝试提供一个调用提供的 lambda 的函数,我想知道如果该函数的返回类型为 void,是否可以让它返回默认值。

到目前为止,这是一个返回 lambda 返回值的函数,但如果 lambda 为 void,则返回 20。

#include <functional>
#include <iostream>

template <typename H>
auto f(H&& h) -> decltype(h(), void())
{
return h();
}

template <typename H>
auto f(H&& h) -> decltype(h(), int())
{
h();
return 20;
}

int main()
{
int r = f([](){ std::cout << "test1" << std::endl; return 10; }); // error here
std::cout << "r: " << r << std::endl;
r = f([](){ std::cout << "test2" << std::endl; });
std::cout << "r: " << r << std::endl;

return 0;
}

这会产生错误,

test.cpp:20:68: error: call of overloaded ‘f(main()::<lambda()>)’ is ambiguous

很明显,这只是因为 C++ 无法使用基于返回类型的多态性。但是,我想知道是否有任何好的 C++11 技巧,例如更好地使用 decltype 或一些模板魔术,可以使这成为可能?我问是因为据我所知,这里没有真正的歧义。编译器正在推断 void 返回类型,然后说是否匹配 intfvoid 版本,这有点傻。

这样做的一个原因是,如果函数 f 需要返回值,但用户提供的 lambda 不包含 return 语句,编译器会推断void 类型,然后出错。因为在实际场景中,当用户不关心提供一个合理的默认返回值时,我很清楚应该是什么,我想知道是否有可能让编译器允许用户忽略通常不必要的 return 声明以方便使用。

谢谢。我应该提到我使用的是 GCC 4.6.3。

回答:根据 Xeo 关于使用 enable_if 的建议,我想出了以下方法,这似乎可行:

template <typename H>
auto f(H&& h) -> typename std::enable_if<std::is_same<decltype(h()), void>::value, int>::type
{
h();
return 20;
}

template <typename H>
auto f(H&& h) -> typename std::enable_if<std::is_same<decltype(h()), int>::value, int>::type
{
return h();
}

谢谢!

最佳答案

你可以使用 std::enable_if。

您的返回类型将是 std::enable_if<!std::is_same<decltype(h()), void>::value, decltype(h())>:type对于第一个,std::enable_if<std::is_same<decltype(h()), void>::value, int>::type对于第二个。那应该让你的代码工作。我还没有测试过它,所以我不确定它是否完全有效。

关于c++ - 有什么方法可以匹配 C++11 中的返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12547076/

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