【发布时间】:2021-02-21 02:33:55
【问题描述】:
我如何编写需要一个成员函数模板的 C++ 20 概念,该模板接受一个必须提供的模板参数?
以下概念的目标是检查一个类型是否类似于元组,除了检查std::get<I>(t),我想检查t.get<I>()。
以下内容不能使用开关-std=c++2a 与 g++ 10.1 一起编译。
#include <concepts>
template <typename E>
concept Tpl = requires(E const e, int idx)
{
{
e.template get<idx>()
} -> std::convertible_to<float>;
};
如果template没有在get之前使用,当然是不能编译的(没有尖括号,小于/大于运算符)。
【问题讨论】:
-
我不确定你在这里问什么 - 你所说的“明确陈述的参数类型(注意可推导)”是什么意思?我们在这里讨论的是哪个论点?
-
我假设他想要一些
Tuple-Like类,它的成员函数的行为类似于std::get<Idx>(TupleLike)- 但就像成员函数一样。 -
@Bernd 如果这就是 OP 想要的,那么 OP 可以编辑问题来说明这一点。或者如果他们想要不同的东西,他们应该说不同的东西。
-
是的,就像在 std::tuple 中一样。由于成员函数没有参数,因此不能推导出成员函数模板参数。这是设计使然,模板参数在调用中声明:
e.get<idx>()在模板调用中,e.template get<idx>()。 -
它有是一个参数化的整数吗?检查
e.template get<(int)0>()的有效性还不够吗?
标签: c++ templates member c++20 concept