以下情况:
class CTest
{
public:
CTest()=default;
~CTest()=default;
auto SomeFunc_Helper(std::integral_constant<int, 8> param) -> uint64_t*; //param is in reality more or less a self-implemented std::integral_constant
auto SomeFunc() -> [how do I get the return type of SomeFunc_Helper?]
{
return SomeFunc_Helper(std::integral_constant<int, sizeof(uintptr_t)>{});
}
};
对于SomeFunc()
,我尝试了类似的操作
auto SomeFunc() ->decltype(&CTest::SomeFunc_Helper(std::integral_constant<int, 8>))
给了我一个错误,指出std::integral_constant<int, 8>
无法解决。
所以我的问题是如何将一个函数从一个类型转发到另一个函数?
(欢迎使用C ++ 11以外的解决方案,但不包括std::
名称空间)
答案 0 :(得分:3)
这是值得使用宏的情况之一。
#define RETURNS(...) \
noexcept(noexcept(__VA_ARGS__)) \
-> decltype(__VA_ARGS__) \
{ return __VA_ARGS__; }
现在您可以:
auto SomeFunc()
RETURNS( SomeFunc_Helper(std::integral_constant<int, sizeof(uintptr_t)>{}) )
有人建议RETURNS
的等效功能将成为=>
或类似的lambda;我希望它将被推广。
答案 1 :(得分:2)
您可以尝试以下方法:
auto SomeFunc() -> decltype(SomeFunc_Helper(std::integral_constant<int, 8>()))
{
/* ... */
}
尾随返回类型中decltype
的参数可以是任何有效表达式,在这种情况下,是对在函数体内实际执行的成员函数的精确调用。
答案 2 :(得分:2)
我认为您正在寻找std::result_of
,但是,在这种情况下,只需将返回类型声明为decltype(auto)
(自C ++ 14起)就可以了:
auto SomeFunc() -> decltype(auto)
{
return SomeFunc_Helper(std::integral_constant<int, 8>{});
}
通过这种方式,例如,如果函数返回引用,您也可以将引用完美转发到SomeFunction
。