gpt4 book ai didi

c++ - 这个成员函数选择代码可以在没有 std::invoke 的情况下编写吗?

转载 作者:行者123 更新时间:2023-12-01 13:26:43 24 4
gpt4 key购买 nike

我试图选择一个成员 fn基于一些 constexpr值(value)。然后我尝试调用选定的函数,但我收到有关如何调用成员 fn 的错误消息。语法不正确。

error: must use '.*' or '->*' to call pointer-to-member function in
'S::SelectedGetter<&S::fn1, &S::fn2>::fn (...)', e.g. '(... ->*
S::SelectedGetter<&S::fn1, &S::fn2>::fn) (...)'
18 | return SelectedGetter<&S::fn1, &S::fn2>::fn();
我试图称之为“正确”但失败了。最后我用的是 std::invoke ,但我想知道这是否可以在没有 std::invoke 的情况下完成,仅使用“原始”C++ 语法。
#include <algorithm>
#include <type_traits>

static constexpr int number = 18;

struct S
{
using GetterFn = uint32_t(S::*)() const;
uint32_t fn1()const {
return 47;
}
uint32_t fn2() const {
return 8472;
}

template <GetterFn Getter1, GetterFn Getter2>
struct SelectedGetter
{
static constexpr GetterFn fn = (number < 11) ? Getter1 : Getter2;
};

uint32_t f() {
return std::invoke((SelectedGetter<&S::fn1, &S::fn2>::fn), this);
}
};

int main()
{
return S{}.f() % 100;
}
godbolt link
注意:我对 C++20 解决方案没问题,例如如果一些 concept魔法可以帮...

最佳答案

你可以这样称呼它 normal member function pointer call .
正确的语法是

 return ((*this).*SelectedGetter<&S::fn1, &S::fn2>::fn)();
或者
return (this->*SelectedGetter<&S::fn1, &S::fn2>::fn)();
( See a demo )

旁注:
  • 如果您在 f 中调用的函数是 const ,你也可以制作它uint32_t f() const
  • 其次,您可以更换SelectedGettervariable template (自 ),现在您需要更少的输入

  • 它看起来像
    // variable template
    template<GetterFn Getter1, GetterFn Getter2>
    static constexpr auto fn = (number < 11) ? Getter1 : Getter2;

    uint32_t f() const {
    return (this->*fn<&S::fn1, &S::fn2>)();
    }
    ( See a demo )

    关于c++ - 这个成员函数选择代码可以在没有 std::invoke 的情况下编写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63521731/

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