2010-02-13 32 views
6

Tôi muốn viết một cái gì đó như thế này, mà không thể được biên dịch:Kết hợp tăng :: lexical_cast và std :: transform

std::vector<A> as; 
std::vector<B> bs(as.size()); 
std::transform(as.beginn(), as.end(), bs.begin(), boost::lexical_cast<B>); 

Nhưng điều này không hoạt động, vì vậy tôi đã tạo ra một functor được làm điều này cho tôi:

template<typename Dest> 
struct lexical_transform 
{ 
    template<typename Src> 
    Dest operator()(const Src& src) const 
    { 
     return boost::lexical_cast<Dest>(src); 
    } 
}; 

Có cách nào dễ hơn để thực hiện việc này không?

Trả lời

16

lexical_cast có hai đối số mẫu: loại mục tiêu và loại nguồn. Sử dụng bình thường, thứ hai được suy ra từ cuộc gọi.

Tuy nhiên, ở đây bạn muốn lấy địa chỉ của các chức năng, và bạn cần phải xác định tất cả các đối số mẫu:

std::transform(as.begin(), as.end(), bs.begin(), boost::lexical_cast<B, A>); 
+0

thnx rất nhiều, nó hoạt động hoàn hảo –

1

Nếu bạn làm điều này loại điều rất nhiều bạn có thể muốn xem xét các Boost.Convert thư viện (không phải là một phần được chấp nhận của Boost). Xem ví dụ này từ hướng dẫn sử dụng:

std::transform(strings.begin(), strings.end(), 
       std::back_inserter(integers), 
       boost::convert<int>::from<string>()); 
+0

có lợi thế nào so với cách tiếp cận của UncleBens không? –

+0

Không thực sự cho ví dụ của bạn nói chung nó mang lại cho bạn nhiều quyền lực hơn. Ví dụ, bạn có thể sử dụng các thao tác IO như std :: hex hoặc chỉ định một giá trị mặc định được sử dụng trong trường hợp chuyển đổi là không thể – Manuel

Các vấn đề liên quan