识别元组c ++ 11中的指针

时间:2017-01-22 18:55:02

标签: c++11 pointers tuples

我需要将元组转换为字节数组。这是我用来转换为字节数组的代码:

    template< typename T > std::array< byte, sizeof(T) >  get_bytes( const T& multiKeys )
    {
     std::array< byte, sizeof(T) > byteArr ;
     const byte* start = reinterpret_cast< const byte* >(std::addressof(multiKeys) ) ;
     const byte* end = start + sizeof(T);
     std::copy(start, end, std::begin(byteArr));
     return byteArr;
    }    

以下是我的称呼方式:

    void foo(T... keyTypes){
        keys = std::tuple<T... >(keyTypes...);
        const auto bytes = get_bytes(keys);
    }

我需要扩充这段代码,以便当指针是元组的一部分时,我将其取消引用它的值,然后将新元组(没有任何指针)传递给get_bytes()函数。如何检测元组中是否存在指针?然后我可以遍历元组并用以下代码取消引用它:

    std::cout << *std::get<2>(keys) << std::endl;

2 个答案:

答案 0 :(得分:0)

添加一个简单的重载:<div class="form-group"> <label>Select Status</label> <select name="status_select" id="status_select" ng-model="status.model" class="form-control"> <option ng-repeat="x in status.options" value="{{x.id}}">{{x}}</option> </select> </div>

答案 1 :(得分:0)

使用C ++ 14会很容易:

#include <iostream>
#include <tuple>
#include <utility>

template <class T> decltype(auto) get_dereferenced_value(T &&value) {
  return std::forward<T>(value);
}

template <class T> decltype(auto) get_dereferenced_value(T *value) {
  return *value;
}

template <class Tuple, class Indexes> struct get_dereferenced_tuple_impl;

template <class... Args, size_t... Index>
struct get_dereferenced_tuple_impl<std::tuple<Args...>,
                                   std::integer_sequence<size_t, Index...>> {
  decltype(auto) operator()(std::tuple<Args...> const &originalTuple) {
    return std::make_tuple(
        get_dereferenced_value(std::get<Index>(originalTuple))...);
  }
};

template <class Tuple>
decltype(auto) get_dereferenced_tuple(Tuple const &tupleValue) {
  return get_dereferenced_tuple_impl<
      Tuple,
      std::make_integer_sequence<size_t, std::tuple_size<Tuple>::value>>{}(
      tupleValue);
}

int main() {
  char c = 'i';
  std::tuple<char, char *> t{'h', &c};
  auto t2 = get_dereferenced_tuple(t);
  std::cout << std::get<0>(t2) << std::get<1>(t2) << "\n";
  return 0;
}

如果您不能使用C ++ 14,则必须编写更详细的decltype表达式,并包含std::(make_)integer_sequence的{​​{3}}。

这有一个缺点:在复制字节之前将进行复制。引用元组不是一个好主意。性能最高的版本是get_bytes能够直接序列化整个混合元组。