代码之家  ›  专栏  ›  技术社区  ›  Matthew

重载运算符|用于固定大小的阵列?

  •  2
  • Matthew  · 技术社区  · 7 年前

    考虑以下因素:

    template <typename T> struct template_adapter_t {};
    
    template <int N> struct foo_adapter_t {
      template <typename T> static foo_t<T, N> adapt(T const&);
    };
    template <int N> template_adapter_t< foo_adapter_t<N> > foo();
    
    template <typename Range, typename Adapter>
    auto operator|(
      Range const& range,
      template_adapter_t<Adapter>(*)())
    -> decltype(Adapter::adapt(range))
    { return Adapter::adapt(range); }
    

    (那么,这里发生了什么……我有一个“虚拟”类, template_adapter_t ,它仅用作专门化限制器,一个具体的助手类 foo_adapter_t ,一个自由函数 foo 返回 template\u adapter\u t ,并且过载 operator| 它应该接受LHS上的任何内容,以及指向一个函数的指针,该函数不接受任何参数,并返回某种类型的 template\u adapter\u t 在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>{};
    

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

    我遗漏了什么,替代调用可以工作,但第一个不能?我怎样才能使第一张表格生效?

    Live example

    1 回复  |  直到 7 年前
        1
  •  3
  •   llllllllll    7 年前

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

    在此行中:

    values | foo<2>;
    

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