如何通过可变参数模板表达概念?
How to express concepts over variadic template?
我想定义一个概念,只有具有特定类型值的元组才能满足。
为了简单起见,我只想接受仅包含数字类型元素的元组。我该怎么做?
例如
std::tuple<int16_t, int32_t> // satisfies concept
std::tuple<std::string, double> // doesn't satisfy concept
问题是我必须制定类似于“for_each_type”的内容。也不允许使用递归概念。
足够简单:
namespace impl {
template <class T>
struct is_tuple_of_integrals
: std::false_type { };
template <std::integral... Ts>
struct is_tuple_of_integrals<std::tuple<Ts...>>
: std::true_type { };
}
template <class T>
concept tuple_of_integrals = impl::is_tuple_of_integrals<T>::value;
我确实想知道是否可以省略中间特征,但我不相信没有概念专业化。
我的解决方案:
template<typename ... Args>
concept numeric_tuples = (std::is_integral_v<Args> && ...);
template<typename ... Args>
void foo(std::tuple<Args...> t) requires numeric_tuples<Args...> {
}
这个概念我使用了折叠表达式。
我想定义一个概念,只有具有特定类型值的元组才能满足。
为了简单起见,我只想接受仅包含数字类型元素的元组。我该怎么做?
例如
std::tuple<int16_t, int32_t> // satisfies concept
std::tuple<std::string, double> // doesn't satisfy concept
问题是我必须制定类似于“for_each_type”的内容。也不允许使用递归概念。
足够简单:
namespace impl {
template <class T>
struct is_tuple_of_integrals
: std::false_type { };
template <std::integral... Ts>
struct is_tuple_of_integrals<std::tuple<Ts...>>
: std::true_type { };
}
template <class T>
concept tuple_of_integrals = impl::is_tuple_of_integrals<T>::value;
我确实想知道是否可以省略中间特征,但我不相信没有概念专业化。
我的解决方案:
template<typename ... Args>
concept numeric_tuples = (std::is_integral_v<Args> && ...);
template<typename ... Args>
void foo(std::tuple<Args...> t) requires numeric_tuples<Args...> {
}
这个概念我使用了折叠表达式。