尝试做类似...

template <class T>
struct Wrapper
{
    template <class U>
    void set(const U& u) { myT = u; }

    template <class F>
    void set(F f) { myT = f(); }

    T myT;
};

我知道我需要在这里使用SFINAE,但是如何区分回调参数和值参数呢?可以安全地假定一个值不能用作回调。

我已经尝试将enable_ifis_function, result_ofinvoke_resultis_invocable等一起使用,但都无法正常工作。可能吗?

最佳答案

您可以在不使用SFINAE的情况下进行操作:

template<class U>
void set(const U& u) {
    if constexpr (std::is_invocable_v<U>)
        myT = u();
    else
        myT = u;
}

或者以更通用的方式:
template<class U>
void set(U&& u) {
    if constexpr (std::is_invocable_v<U>)
        myT = std::forward<U>(u)();
    else
        myT = std::forward<U>(u);
}

09-06 19:16