title: How to define a "sample" for boost test dataset with an arity > 1
body: <p>I'd prefer to group my function params and expected results together in a logical group but I cannot figure out how to create a boost dataset sample with arity &gt; 1 on my own without zipping together other data sets. Below is some code that I am trying to achieve</p>
  <p>It feels like I should be able to do what I want.</p>
  <pre><code>#define BOOST_TEST_MODULE dataset_test
  #include &lt;boost/test/data/monomorphic.hpp&gt;
  #include &lt;boost/test/data/test_case.hpp&gt;
  #include &lt;boost/test/included/unit_test.hpp&gt;
  
  int my_function_to_test(int left, int middle, int right)
  {
     if(left &gt; middle)
        return left + right;
     else if(right &gt; middle)
        return left + middle;
  
     return left + middle + right;
  }
  
  // This works ok - but I don't like the defining each sample across 4 datasets
  auto lefts    = boost::unit_test::data::make({1, 43, 5, 6435, 564, 457, 457});
  auto middles  = boost::unit_test::data::make({9, 4, 43, 12, 4, 99, 7});
  auto rights   = boost::unit_test::data::make({44, 11, 22, 88, 99, 66, 77});
  auto expected = boost::unit_test::data::make({-1, -2, -3, -4, -5, -6, -7});
  auto data     = lefts ^ middles ^ rights ^ expected;
  
  // I'd rather something like this type of dataset
  struct Sample
  {
     int left;
     int middle;
     int right;
     int expected;
  };
  // Here I can neatly define the 3 params and the result together, which is more readble
  std::vector&lt;Sample&gt; data2 = {
     {1, 9, 44, -1},     // Test _0
     {43, 4, 11, -2},    // Test _1
     {5, 43, 22, -3},    // Test _2
     {6435, 12, 88, -4}, // Test _3
     {564, 4, 99, -5},   // Test _4
     {457, 99, 66, -6},  // Test _5
     {457, 7, 77 - 7}    // Test _6
  };
  
  // Also tried this and other variations
  //auto data3=boost::unit_test::data::make&lt;std::tuple&lt;int,int,int,int&gt;&gt;({
  //   {1, 9, 44, -1},     // Test _0
  //   {43, 4, 11, -2},    // Test _1
  //});
  
  BOOST_DATA_TEST_CASE(test1, data, left, middle, right, expected_result)
  {
     auto result = my_function_to_test(left, middle, right);
     BOOST_TEST(result == expected_result);
  }
  
  BOOST_DATA_TEST_CASE(test2, data2, left, middle, right, expected_result)
  {
     auto result = my_function_to_test(left, middle, right);
     BOOST_TEST(result == expected);
  }
  </code></pre>