2011-01-13 40 views
4

是否可以执行以下操作。Boost元组+变换

说我升压元组具有<std::string, T>

我想使用std ::变换+ mem_fun在相应的矢量仅插入的std :: string元素。是否有可能还是我们需要使用一个循环和的push_back(获得< 0>)...

即下面不喜欢编译...(未知类型...)

result.resize(storage.size()) 
std::transform(storage.begin(), storage.end(), result.begin(), std::mem_fun(&boost::get<0>)); 

这里是(尝试一个评论)一个例子:

#include <boost/tuple/tuple.hpp> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <boost/bind.hpp> 

template <typename T> 
class TestClass 
{ 
private: 
    typedef boost::tuple<std::string,T> PairType; 
    std::vector<PairType> storage; 
public: 
    void extract(std::vector<std::string> &result) 
    { 
     result.resize(storage.size()); 
     std::transform(storage.begin(), storage.end(), result.begin(), boost::bind(&PairType::get<0>, _1)); 
    } 
}; 

int main(int argc, char**argv) 
{ 

    TestClass<int> bb; 
    std::vector< std::string> result; 
    bb.extract(result); 
    return 0; 
} 

g++ test.cpp 
test.cpp: In member function `void TestClass<T>::extract(std::vector<std::string, std::allocator<std::string> >&)': 
test.cpp:17: error: expected primary-expression before ',' token 
test.cpp: In member function `void TestClass<T>::extract(std::vector<std::string, std::allocator<std::string> >&) [with T = int]': 
test.cpp:26: instantiated from here 
test.cpp:17: error: address of overloaded function with no contextual type information 
+1

您需要提供更多的代码和编译器呕吐。 – 2011-01-13 01:42:54

回答

1

类型所需的get<0>超载是:

const std::string& (*)(const boost::tuples::cons<std::string, boost::tuples::cons<int, boost::tuples::null_type> >&) 

如果typedef,为get0_fn_t,那么你可以声明一个指向该get<0>超载有:

get0_fn_t getter_fn = &boost::tuples::get<0, std::string, boost::tuples::cons<int, boost::tuples::null_type> >; 

编辑:这个程序是一个完整的实例:

#include <algorithm> 
#include <cstdlib> 
#include <iostream> 
#include <iterator> 
#include <string> 
#include <vector> 
#include <boost/bind.hpp> 
#include <boost/tuple/tuple.hpp> 

int main() 
{ 
    typedef boost::tuple<std::string, int> tuple_type; 
    std::vector<tuple_type> tuples; 
    tuples.push_back(boost::make_tuple(std::string("test3"), 3)); 
    tuples.push_back(boost::make_tuple(std::string("test0"), 0)); 

    std::vector<std::string> strings; 
    typedef const std::string& (*get0_fn_t)(const boost::tuples::cons<std::string, boost::tuples::cons<int, boost::tuples::null_type> >&); 
    get0_fn_t getter_fn = &boost::tuples::get<0, std::string, boost::tuples::cons<int, boost::tuples::null_type> >; 
    std::transform(tuples.begin(), tuples.end(), std::back_insert_iterator<std::vector<std::string> >(strings), getter_fn); 

    std::vector<std::string>::const_iterator it, end = strings.end(); 
    for (it = strings.begin(); it != end; ++it) 
     std::cout << *it << std::endl; 

    return EXIT_SUCCESS; 
} 

EDIT2:这说明如何将它集成到TestClass模板:

template <typename T> 
class TestClass 
{ 
private: 
    typedef boost::tuple<std::string, T> PairType; 
    std::vector<PairType> storage; 

public: 
    void extract(std::vector<std::string>& result) const 
    { 
     result.clear(); 
     typedef const std::string& (*get0_fn_t)(const boost::tuples::cons<std::string, boost::tuples::cons<T, boost::tuples::null_type> >&); 
     get0_fn_t getter_fn = &boost::tuples::get<0, std::string, boost::tuples::cons<T, boost::tuples::null_type> >; 
     std::transform(storage.begin(), storage.end(), result.begin(), getter_fn); 
    } 
}; 
3

使用的get和Boost.Bind成员版本。我已经测试过它,它的工作原理,它的价值。

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <string> 
#include <vector> 

#include <boost/bind.hpp> 
#include <boost/tuple/tuple.hpp> 

int main() 
{ 
    typedef boost::tuple<std::string,int> T; 
    std::vector<T> v1; 
    v1.push_back(T("Blah", 23)); 
    v1.push_back(T("Wibble", 9)); 

    std::vector<std::string> v2; 
    std::transform(v1.begin(), v1.end(), std::back_inserter(v2), boost::bind(&T::get<0>, _1)); 

    std::copy(v2.begin(), v2.end(), std::ostream_iterator<std::string>(std::cout, "\n")); 

    return 0; 
} 
+0

好的,如果我们有int作为模板参数,那么怎么样? – 2011-01-13 02:08:06

+0

+1非常好的解决方案 – 2011-01-13 02:10:06