【问题标题】:Converting between vectors向量之间的转换
【发布时间】:2015-02-11 22:36:35
【问题描述】:

我有两个类:AB,以及从As 到Bs 的隐式转换。我还有一个vector<A>,我想把它转换成vector<B>。是否可以添加一个允许我将vector<A> 隐式或显式转换为vector<B> 的转换?

我知道我可以使用described here 技术,但是有什么方法可以实现两者之间的隐式转换吗?还是显式转换?

【问题讨论】:

  • 您的链接“在此处描述”为您的问题提供了单行答案。你不喜欢这个答案的什么地方?
  • 这一行让我描述了如何在我的代码中进行转换,而不仅仅是我想要进行转换。太冗长了。

标签: c++ templates implicit-conversion explicit-conversion


【解决方案1】:

通常你不应该这样做,因为vector<A>vector<B> 有不同的实现(特别是如果vector 是一个模板特化,如vector<bool>)。

如果您不喜欢复制向量,请从其他角度看一下:您需要 vector<A> 的行为 vector<B>:您需要转换 interfaces 而不是 implementation。使用重载的operator*operator->vector<A> 实现适配器,这就像你需要的B。

【讨论】:

    【解决方案2】:

    间接地,有。可能不是您要找的,
    但你可以让你的函数成为接受
    的模板 迭代器对作为参数:

    void doSomething( const B& );
    
    template<typename Itr>
    void foo1( Itr beg, Itr end )
    {
        while( beg != end )
            doSomething(*beg++);
    }
    
    void foo2()
    {
        vector<A> vec;
        foo1( vec.begin(), vec.end() );
    }
    

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      我希望在 C# 的路线以及 C++ 的模板专业化方面有一个技巧。像这样的:

      template<>                                                     // C++ specialization
      vector<B>::operator vector<A>(this const vector<A> &vec) const // c# extension method
      {
          return vector<C>(vec.begin(), vec.end());
      }
      

      然后让我简单说明:

      vector<A> va;
      vector<B> vb = va;
      

      唉,这在 C++ 中是不可能的,所以我只添加一个全局函数:

      vector<B> ConvertToB(const vector<A> &vec);
      

      谢谢大家。

      【讨论】:

        猜你喜欢
        • 2016-03-10
        • 2015-07-21
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多