标签: std-invoke

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

我试图fn根据某个constexpr值选择一个成员。然后我尝试调用选定的函数,但是我收到了关于如何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();
Run Code Online (Sandbox Code Playgroud)

我试图称之为“正确”但失败了。最后我使用的是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 …
Run Code Online (Sandbox Code Playgroud)

c++ templates member-function-pointers c++20 std-invoke

5
推荐指数
1
解决办法
94
查看次数

C++:std::invoke 需要完美转发吗?

片段

template <typename CallableType, typename... Args>
auto invokeTest(CallableType&& fn, Args&&... args)
{
    return std::invoke(fn, std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

是否std::forward<Args>需要在这里?或者写就够了

template <typename CallableType, typename... Args>
auto invokeTest(CallableType&& fn, Args&&... args)
{
    return std::invoke(fn, args...);
}
Run Code Online (Sandbox Code Playgroud)

有什么区别?

c++ perfect-forwarding c++17 std-invoke

3
推荐指数
1
解决办法
140
查看次数