Re: Converting between vectors
On 4/21/2011 11:36 AM, Andrea Crotti wrote:
I need in short to serialize vector of different types into a stream of
chars, which is then sent over the network.
Boost unfortunately is not the answer since I can't use it in the
project.
Until now I used the function below, but I found out that is terribly
buggy, since it doesn't work in all cases of type conversion and even
size.
But I can't find a way to fix it and to make it general, any idea /hint?
Thanks,
Andrea
#include<assert.h>
#include<string>
#include<cstdlib>
#include<iostream>
#include<vector>
template<typename INP, typename OUT>
std::vector<OUT> vectorConversion(const std::vector<INP>& input)
{
size_t size_inp = sizeof(INP);
size_t size_out = sizeof(OUT);
// make sure the sizeof are multiples between them, otherwise it doesn't work!
assert(((size_inp % size_out) == 0) || ((size_out % size_inp) == 0));
std::vector<OUT> res;
size_t size = (size_inp * input.size()) / size_out;
res.resize(size);
// is it memcpy a good idea in this case?
memcpy(&res[0],&input[0], size_inp * input.size());
return res;
}
int main()
{
std::vector<int> vec(5, 1);
std::vector<long> lvec = vectorConversion<int, long>(vec);
std::vector<int> vec2 = vectorConversion<long, int>(lvec);
assert(vec == vec2);
return 0;
}
First off, you should allow the compiler to detemine the 'INP' type from
the argument. Redefine your template as
template<typename OUT, typename INP> ...
and use it this way:
std::vector<long> lvec = vectorConversion<long>(vec);
then the argument you didn't explicitly provide will be deduced.
Second, 'memcpy' is not a good idea. A loop with assignment from one to
the other should do just fine.
Third, try plain initialization from a pair of iterators:
std::vector<long> lvec(vec.begin(), vec.end());
I am not sure it should work if the value_type types are different, but
it costs next to nothing to try.
V
--
I do not respond to top-posted replies, please don't ask