#include <algorithm>
#include <iostream>
#include <vector>

struct Move
{
    bool operator < (const Move&) = delete;
    
    std::string s;
};

template <typename T>
struct Wrapper{
    Wrapper(const T & pair): pair_mem(pair) {}
    
    bool operator <(const Wrapper& rhs) const {
        return pair_mem.first < rhs.pair_mem.first;
    }
    T pair_mem;
};

int main() {
    std::vector<Wrapper<std::pair<int, Move>>> v{{{5, {"World"}}}, {{0, {"Hi"}}}, {{42, {"World"}}}};
    
    std::sort(v.begin(), v.end());
    
    for (const auto& w : v) {
        std::cout << w.pair_mem.first << " " << w.pair_mem.second.s << std::endl;   
    }
}
