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

以类似stl的方式转换数组

  •  2
  • fho  · 技术社区  · 14 年前

    现在是另一个“如何在C++中做这个而不松开我的握柄”的时候了!

    这次:

    考虑到以下代码取自 cplusplus.com :

    template<class InputIterator, class OutputIterator>
      OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
    {
      while (first!=last) *result++ = *first++;
      return result;
    }
    

    有铸造的方法吗 *first 到类型 *result ?

    换句话说:有没有一种方法可以确定(在编译时)结果的类型?

    4 回复  |  直到 14 年前
        1
  •  6
  •   Armen Tsirunyan    14 年前

    是的,类型 *result 是(因为 result OutputIterator )

    typename std::iterator_traits<OutputIterator>::value_type
    

    当然,如果输出器是一个指针或一个正确编写的STL兼容的迭代器。否则,不,我想没有办法。 在即将到来的C++ 0x中,这将是非常容易的,也就是说,

    decltype(*result)
    

    HTH

    阿芒

        2
  •  1
  •   Oliver Charlesworth    14 年前

    对你的问题不是一个准确的答案,但听起来你不想 std::copy 你想 std::transform 将数据转换为其他类型。在这种情况下,请执行以下操作:

    template <typename A, typename B>
    B convert(A x) { return static_cast<B>(x); }
    
    ...
    
    std::transform(v1.begin(), v1.end(), v2.begin(), convert<float,int>);
    
        3
  •  1
  •   Tony Delroy    14 年前

    您可以修改复制例程以使用模板进行转换…

    template <typename A, typename B>                                               
    const A& cast(const A&, const B& b)                                             
    {                                                                               
        return *reinterpret_cast<const A*>(&b);                                     
    };                                                                              
    
    template <class InputIterator, class OutputIterator>                            
    OutputIterator mycopy(InputIterator first, InputIterator last,                    
                          OutputIterator result)                                      
    {                                                                               
        for ( ; first != last; ++first, ++result)                                   
            *result = cast(*result, *first);                                        
        return result;                                                              
    }
    

    这就是说,如果你不想专门学习如何修改副本来处理这个问题,奥利的回答会更好。

        4
  •  1
  •   James Kanze    14 年前

    简短的答案是否定的。如果输出器真的是 输出器(例如Ostream_迭代器),然后: typename std::iterator_traits::value_类型 将是无效的,在C++0X中, decltype(*结果) 可能是外泄者。(所以Armen的建议没有 使用模板代码。)

    托尼提出的重新解释演员阵容的建议不起作用。 要么。事实上,它会破坏一些有用的东西(例如 输入器返回int,输出器需要 双倍)。

    唯一真正的答案是奥利的。这是合乎逻辑的:你 真正想做的是转换数据,而不仅仅是复制它。