我正在尝试提供一个调用提供的lambda的函数,并想知道是否有可能在函数的返回类型为
这是我目前的代码,它返回lambda的返回值,但如果lambda是
这会产生错误:
很显然,这是由于C++不能基于返回类型使用多态性所致。但我想知道是否有任何好的C++11技巧(例如更好地使用
做这件事的一个原因是,如果函数
谢谢。我应该提到我正在使用GCC 4.6.3。 答案:基于Xeo建议使用
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
返回类型,然后说模糊匹配是否要匹配 int
或 void
版本的 f
,这有点傻。做这件事的一个原因是,如果函数
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();
}
谢谢!
decltype
的第二个参数:我可以问一下它是干嘛用的吗?(真的,因为我不知道!) - David G