过载运算符|对于固定大小的数组?

时间:2018-04-03 20:04:31

标签: c++ templates operator-overloading

请考虑以下事项:

template_adapter_t

(那么,这里发生了什么......我有一个&#39;虚拟&#39;类,foo_adapter_t,它只作为一个特化限制器,一个具体的助手类foo ,一个自由函数template_adapter_t,返回一个operator|类型,一个template_adapter_t的重载应该在LHS上取任何东西,一个指向不带参数的函数的指针在RHS上返回某种类型的int const values[] = { ... }; values | foo<2>; 。)

当我尝试使用它时:

std::vector<int>{} | foo<2>;

...我收到有关无效操作数的错误。

然而,这有效:

template <typename Range, int N>
auto operator|(
  Range const& range,
  foo_adapter_t<N> const& adapter)
-> decltype(adapter.adapt(range))
{ return adapter.adapt(range); }

values | foo_adapter_t<4>{};

有效:

react-native upgrade

...所以问题似乎与LHS上的匹配无关。在这两种情况下,RHS也是模板化的,但出于某种原因,采用结构的结构起作用,但采用函数的结构不起作用。

我错过了备用调用有效,但第一个调用没有?如何让第一张表格有效?

Live example

1 个答案:

答案 0 :(得分:3)

这是因为你不能为2个指针重载运算符。至少应该使用一个操作数定义的类(参见here)。

在这一行:

values | foo<2>;

values是指向const int的指针,foo<2>是一个函数指针,因此不会考虑重载运算符。