C ++ 11中的类型转发

时间:2018-08-14 13:17:14

标签: c++ c++11 return-type decltype trailing-return-type

以下情况:

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::名称空间)

3 个答案:

答案 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