2017-01-22 64 views
0

我需要將元組轉換爲字節數組。這是我使用轉換爲字節數組的代碼:識別元組中的指針C++ 11

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; 

回答

0

添加一個微不足道的過載:T get_bytes(T const* t) { return getBytes(*t); }

+0

我認爲這隻適用於所有的元組元素都是指針的情況。如果一個元組元素是一個char *,其餘的則是int。 – jok

+0

@jok:然後你爲指針調用'char get_bytes (char const *)',爲整數調用'int get_bytes (int)'。只是爲了澄清:這當然假設你正在遍歷所有的元組元素,並在每個單獨的元素上調用'get_bytes'。 – MSalters

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_sequencean implementation

雖然這有一個缺點:副本將在複製字節之前進行。引用的元組不是一個好主意。性能最高的版本將是能夠直接序列化整個混合元組的get_bytes