【发布时间】:2021-07-01 14:52:21
【问题描述】:
试图重写这样的谓词组合器
auto constexpr all = [](auto const&... predicates){
return [predicates...](auto const&... x){
return (predicates(x...) && ...);
};
};
(this 的小泛化)以某种方式在输入具有不同参数/参数的非谓词/谓词时会产生有意义的错误,我开始写这样的东西:
template<typename T, typename = void>
struct IsPredicate : public std::false_type {};
template<typename T>
struct IsPredicate<T, std::enable_if_t<std::is_same_v<bool, return_type_of_callable_T>, void>>
: public std::true_type {};
然后我盯着它看了一会儿......如果我什至不知道如何调用它,我什至如何检查函数的返回类型?
我看到了:
- 我什至无法将
decltype(overloaded_predicate_function)传递给IsPredicate,因为不能使用重载名称进行模板类型推导, - 即使我只谈论函数对象,第一个要点的问题也可能适用于
operator(),以防它过载。
所以我的问题是:是否甚至可以确定任意可调用对象的返回类型?
我最感兴趣的是 C++17 的答案,但是,为什么不呢?我也想知道 C++20 的概念在这方面提供了什么。
【问题讨论】:
标签: c++ c++17 template-meta-programming c++20 c++-concepts