尝试做类似...
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_if
与is_function, result_of
,invoke_result
,is_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);
}