【发布时间】:2018-02-14 04:44:14
【问题描述】:
我想请编译器检查一个元组是否只包含“元类型”。
顺便说一句,我对 C++ 概念完全陌生。
template < typename T >
struct Type {
using type = T;
};
//! A type can be easily check with a small concept
template < typename T >
concept bool C_Type = requires {
typename T::type;
};
//! But how to apply it on a whole tuple?
template < typename T >
void foo(T tuple) {}
int main() {
constexpr auto test = std::make_tuple(Type<int>{}, Type<double>{});
foo(test);
}
所以我想确保序列中的每个类型(我们只说这个例子中的 Iterable)都是“元类型”。
如果可以简化代码,我正在使用 Boost Hana。
目前我什至不确定这是否可能。我希望是这样,我想我只需要学习更多元编程的东西。所以我会继续搜索和尝试,但如果有人已经有了答案,谢谢!
【问题讨论】:
-
问题是:你会如何使用
T tuple?你对它有什么限制?必须是std::tuple吗?如果是这样,请使用std::tuple_element,如果不定义您自己的特征和约束...请注意std::tuple_element也处理std::array和std::pair,所以也许您可以期望任何T专门使用它foo。否则你可能想尝试使用decltype(std::get<I>(tuple))或者你访问你的元组元素。 -
您显然没有使用当前版本的概念,因为据我所知,
concept bool在该版本的概念中消失了。您具体问的是哪个版本? -
@Yakk 好吧,我正在阅读 en.cppreference.com/w/cpp/language/constraints 并使用 Gcc 7.1,所以我想成为最后一个。
-
您可以使用递归“遍历可变参数模板(
constexpr或不)的每个元素,请参阅stackoverflow.com/a/38776200/3426025 -
当涉及到遵循标准模型的类元组类型时,编程(元或其他)接口由
std::tuple_element、std::tuple_size和std::get组成.在这些情况下,使用 indices 是主要的。
标签: c++ metaprogramming c++-concepts boost-hana c++20