结合使用boost::lexical_cast和std::transform

6

我想写这样的代码,它无法被编译:

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

但是这种方法不起作用,因此我创建了一个函数对象来为我执行这个操作:
template<typename Dest>
struct lexical_transform
{
    template<typename Src>
    Dest operator()( const Src& src ) const
    {
        return boost::lexical_cast<Dest>( src );
    }
};

有没有更简单的方法来做这件事?

2个回答

16

lexical_cast有两个模板参数:目标类型和源类型。在正常使用情况下,第二个参数可以从调用中推导出来。

但是,在这里您想要获取函数的地址,因此需要指定所有的模板参数:

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

1

如果您经常进行这种操作,您可能需要考虑使用Boost.Convert库(尚未成为Boost的一部分)。请参阅手册中的此示例:

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

相比于UncleBens提供的方法,这种方法有优势吗? - Mathias Soeken
并不是针对你的例子,而是一般情况下它能给你更多的控制权。例如,你可以使用IO操作符,如std::hex,或指定一个默认值,在转换不可能的情况下使用。 - Manuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接