我需要将元组转换为字节数组。这是我用来转换为字节数组的代码:
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 :(得分: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
能够直接序列化整个混合元组。