c++ - 使用类成员函数对象推导成员函数返回类型

标签 c++ templates c++11 decltype

编辑:我现在觉得有点傻。发布的代码实际上适用于 ???=decltype(acc(base(i)))...错误是其他原因 - 虽然非常困惑。我会发a new question关于那个。感谢您的帮助。


我有这样的代码:

template<typename Base, typename Acc>
struct Foo
{
    Base base;
    Acc acc;

    auto operator()(unsigned i) const -> decltype(???) // what is ???
    { return acc(base(i)); }
};

如何获得正确的返回类型?

我尝试使用 decltype(acc(base(i))) 但这给出了一个错误(使用 GCC 4.6.3):

there are no arguments to ‘base’ that depend on a template parameter, so a declaration of ‘base’ must be available

最佳答案

我已经为这些问题烦恼了几个小时或几天。通常 gcc 需要 this->但 clang 没有。在某些情况下 Foo::也有帮助,但有些情况下我已经放弃使用成员名称。以下仅使用 type 名称,并且(虽然更冗长)我认为两者都不会有任何问题:

template<typename Base, typename Acc>
struct Foo
{
    Base base;
    Acc acc;

    template<typename S>
    using result = typename std::result_of<S>::type;

    auto operator()(unsigned i) const
    -> result<const Acc(result<const Base(unsigned)>)>
        { return acc(base(i)); }
};

更一般地,每当decltype(member_name)引起问题,您可以安全地使用 decltype(std::declval<member_type>())其中 member_typeconst -如果使用它的成员函数是const,则为合格.

更一般地说,如果你有一个成员函数是 && , &const&合格,使用member_type , member_type&const member_type&分别在这样的表达式中。

我从未研究过标准所说的内容,但实际上,当涉及到类成员时,编译器在尾随返回类型和内部函数定义中对表达式的处理方式不同。

关于c++ - 使用类成员函数对象推导成员函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115150/

相关文章:

templates - 另一个模板中的 Facelets 模板

c++ - 放置 new 加析构函数和简单的值初始化 noexcept 语义

c++ - 3D vector 和常量

c++ - 使用 C++ 使用 “custom” 捕获器创建 WebRTC VideoTrack

C++ 日期比较并不总是计算出相同的逻辑值

C++ 包括 - 交叉引用文件

c++ - std::reference_wrapper<T> 在容器中的使用

c++ - QSharedPointer 和 QObject::deleteLater

c++ - 在 STL 列表中存储的每个项目中存储对容器对象的引用的最有效方法

c++ - 在编译时将函数指针转换为 std::uintptr_t