【发布时间】:2014-05-09 06:10:55
【问题描述】:
我想使用 boost 将字符串与 "," 连接起来。但是我有一个 shared_ptr 的向量,我需要将其转换为字符串。
(愚蠢的做法是使用 boost::transform 将我的共享指针转换为字符串向量)。 但我想做这样的事情。
注意:我正在使用 VS2012(以及用于 Linux 构建的 gcc 4.5.3)和 boost 1.48.0
C++ 代码。
std::string A::returnConcatString() const
{
return boost::algorithm::join( sharedPtrList() | boost::adaptors::transformed(
[](B::ConstPtr obj )->std::string
{
return ( boost::format( "%s:%s" ) % obj->string1() % obj->string2() ).str();
} ),
",");
}
(顺便说一句,如果我使用匿名函数而不是使用 string2() 会发生什么?)
HPP 代码。
class A
{
public:
/***code***/
vector< B::ConstPtr > sharedPtrList() const;
std::string returnConcatString() const;
}
class B
{
public:
typedef boost::shared_ptr<const B> ConstPtr;
std::string string1() const;
std::string string2() const;
}
有没有更好的方法来做到这一点?谁能帮我理解我的问题?
另外,我发现了这个链接http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3594.html(这正是我想要模仿的)
当我编译这段代码时,我得到一个错误。
C:\temp\tools\Windows\Boost\1.48.0\boost/utility/result_of.hpp(79): error C2903: 'result' : symbol is neither a class template nor a function template
C:\temp\tools\Windows\Boost\1.48.0\boost/utility/result_of.hpp(87) : see reference to class template instantiation 'boost::detail::result_of_nested_result<F,FArgs>' being compiled
with
[
F=balh::`anonymous-namespace'::<lambda0>,
FArgs=balh::`anonymous-namespace'::<lambda0> (const boost::shared_ptr<const balh::B> &)
]
C:\temp\tools\Windows\Boost\1.48.0\boost/utility/detail/result_of_iterate.hpp(33) : see reference to class template instantiation 'boost::detail::tr1_result_of_impl<F,FArgs,HasResultType>' being compiled
with
[
F=balh::`anonymous-namespace'::<lambda0>,
FArgs=balh::`anonymous-namespace'::<lambda0> (const boost::shared_ptr<const balh::B> &),
HasResultType=false
]
C:\temp\tools\Windows\Boost\1.48.0\boost/utility/detail/result_of_iterate.hpp(81) : see reference to class template instantiation 'boost::tr1_result_of<F>' being compiled
with
[
F=balh::`anonymous-namespace'::<lambda0> (const boost::shared_ptr<const balh::B> &)
]
C:\temp\tools\Windows\Boost\1.48.0\boost/mpl/eval_if.hpp(41) : see reference to class template instantiation 'boost::result_of<F>' being compiled
编辑:感谢 [utnapistim] 的想法。我现在正在使用这个。但我真的很想写一个单行:)。
我最终这样做了。
std::string ret;
std::for_each ( array.begin(), array.end(), [&ret](B::ConstPtr firmware)
{
ret.append( ( boost::format( "[%s:%s]" ) % firmwareTypeToString( firmware->firmwareType() ) % firmware->version() ).str() );
}
);
【问题讨论】:
-
做一些可读且实际有效的事情并不是“愚蠢的做法”
-
我同意(我通常这样做),但如果可以避免的话,我不想创建另一个向量(在这种情况下)(特别是因为我不打算将新向量用于除了 boost::join)。
-
喂?为什么需要创建向量?流媒体怎么了?和循环(
for_each,如果你坚持的话?)。您将立即获得大量性能,因为您仍在创建大量中间字符串,所有这些都需要动态分配。 -
我现在最终使用了 for_each。将尝试使用流式传输。
-
为了您的利益(和我的好奇心),我添加了一些基准to my answer