STL-pair-like triplet class - do I roll my own?

前端 未结 5 584
感动是毒
感动是毒 2021-01-03 18:52

I want to use a triplet class, as similar as possible to std::pair. STL doesn\'t seem to have one. I don\'t want to use something too heavy, like Boost. Is there some useful

相关标签:
5条回答
  • 2021-01-03 19:09

    If you can use C++11, use std::tuple

    If not, use boost::tuple

    0 讨论(0)
  • 2021-01-03 19:11

    To add the aspect of similarity to std::pair, you could define a class that has first, second and third. My guess is that in In that case you cannot avoid making a subclass of std::pair and add a 'third' member. It's a few lines of code.

    Furthermore, if you often use these things with the same type, you could make twins and triplet classes as well. Easily made with C++-11's 'using', like:

    template <typename T> using twins = std::pair<T,T>;
    
    0 讨论(0)
  • 2021-01-03 19:12

    No, don't roll your own. Instead, take a look at std::tuple - it's a generalization of std::pair. So here's a value-initialized triple of ints:

    std::tuple<int, int, int> triple;
    

    If you want, you can have a type alias for triples only:

    template<typename T1, typename T2, typename T3>
    using triple = std::tuple<T1, T2, T3>;
    
    0 讨论(0)
  • 2021-01-03 19:26

    I think you need something like this:

    template<typename T>
    struct triplet
    {
        T first, middle, last;
    };
    
    template<typename T>
    triplet<T> make_triplet(const T &m1, const T &m2, const T &m3) 
    {
        triplet<T> ans;
        ans.first = m1;
        ans.middle = m2;
        ans.last = m3;
        return ans;
    }
    

    Examples of usage:

    triplet<double> aaa;
    aaa = make_triplet<double>(1.,2.,3.);
    cout << aaa.first << " " << aaa.middle << " "  << aaa.last << endl;
    
    triplet<bool> bbb = make_triplet<bool>(false,true,false);
    cout << bbb.first << " " << bbb.middle << " "  << bbb.last << endl;
    

    I'm using this and it is enough for my purposes... If you want different types, though, just do some modifications:

    template<typename T1, typename T2, typename T3>
    struct triplet
    {
        T1 first; 
        T2 middle;
        T3 last;
    };
    
    template<typename T1, typename T2, typename T3>
    triplet<T1,T2,T3> make_triplet(const T1 &m1, const T2 &m2, const T3 &m3) 
    {
        triplet<T1,T2,T3> ans;
        ans.first = m1;
        ans.middle = m2;
        ans.last = m3;
        return ans;
    }
    

    And the usage will be very similar:

    triplet<bool,string,myDouble> ccc;
    ccc = make_triplet<bool,string,double>(false,"AB",3.1415);
    ccc.middle = "PI";
    cout << ccc.first << " " << ccc.middle << " "  << ccc.last << endl;
    
    0 讨论(0)
  • 2021-01-03 19:27

    If you're using C++11, you can use std::tuple.

    If you're using C++03, then you'll either need to resort to rolling your own (which isn't too hard), or using tuple from Boost.

    0 讨论(0)
提交回复
热议问题