【发布时间】:2020-03-11 12:52:16
【问题描述】:
由于概念被定义为编译时谓词,是否也可以将这些谓词实际重用于编译时算法?例如,是否可以检查元组中的所有类型是否都符合一个概念?据我所知,不可能以任何方式将概念传递给函数,这让我回到了在这些情况下使用模板。
#include <type_traits>
template<typename T>
concept FloatLike = std::is_same_v<T, float>;
struct IsFloat
{
template<typename U>
constexpr static bool test()
{
return FloatLike<U>;
}
};
template<typename Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate::template test<T>() && ...);
}
int main()
{
static_assert(all_types<IsFloat, float, float>());
static_assert(!all_types<IsFloat, float, int>());
}
我想做的是这样的事情,所以我不必一直包装这个概念就可以使用它:
template<concept Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate<T> && ...);
}
int main()
{
static_assert(all_types<FloatLike, float, float>());
static_assert(!all_types<FloatLike, float, int>());
}
有没有办法接近这个?
【问题讨论】:
-
然后会有增加概念概念的提议...顺便说一句,
all_types()可以使用折叠表达式大大简化... &&:return (... && Predicate::template test<Ts>()); -
@Evg 会很棒 :)
标签: c++ templates template-meta-programming c++20 concept