【发布时间】:2022-12-18 07:45:51
【问题描述】:
#include <tuple>
#include <utility>
template<typename T>
struct is_tuple_like : std::false_type {};
template<typename... Ts>
struct is_tuple_like<std::tuple<Ts...>> : std::true_type {};
template<typename T, typename U>
struct is_tuple_like<std::pair<T, U>> : std::true_type {};
template<typename T>
concept tuple_like = is_tuple_like<T>::value;
template<tuple_like L, tuple_like R, int N = std::tuple_size_v<L>>
auto operator*(const L &lhs, const R &rhs) { return 0; }
enum { Enum };
int main()
{
Enum * Enum; // causes compilation error
return 0;
}
你可以在这里运行代码:http://coliru.stacked-crooked.com/a/f65e333060f40e60
我定义了一个概念,叫做tuple_like,并使用这个概念重载了operator*()。
然后,如果我乘以 enums,我为 tuple_like 重载的 operator*() 被拾取并且编译器抱怨缺少 std::tuple_size 为 enum。
我在这里做错了什么以及如何在不为每个类模板超载的情况下修复它 - std::tuple 和 std::pair?
仅供参考,即使它不寻常,我也无法删除乘以 enums 的部分,因为它不是我的代码。
【问题讨论】:
-
int N有什么用?
标签: c++ operator-overloading c++20 c++-concepts