【发布时间】:2021-07-25 17:51:50
【问题描述】:
我正在尝试使用 C++ 20 的概念来实现 std::is_invocable<R, Callable, Args...>,而 STL 的帮助尽可能少,并且不使用 std::invoke 等。
这是我目前的方法。它会导致编译错误(msvc):
error C3864: 'is_invocable_r': requires clause is incompatible with the declaration
template<class R, class Fn, class... ArgTypes>
requires requires(Fn fn, ArgTypes... arg_types)
{
{ std::forward<Fn>(fn)(std::forward<ArgTypes>(arg_types)...) } -> std::same_as<R>;
}
struct is_invocable_r : std::true_type {};
template<class R, class Fn, class... ArgTypes>
struct is_invocable_r : std::false_type {};
这样做的正确方法是什么?
【问题讨论】:
-
same<R>是什么? -
相当于std::same_as,我已经更新了代码。
-
"不使用 std::invoke 等" 这是一个矛盾。
invocable需要std::invoke存在。它基于std::invoke。此外,您不应该重新实现这样的概念。标准库提供概念是有原因的。 -
我从不认为应该这样做。我这样做是为了学习。话虽如此,我不想要像
requires(...) { std::invoke(...) } -> R这样的简单实现,这就是为什么我明确表示我不希望使用它。
标签: c++ c++20 c++-concepts