Tuples: Can someone help me generalize this?
Hello, boost-users,
what I am trying to accomplish is a generic collection of N objects of
type Type. I need for the N objects to be tightly packed and I would
like the collection to be constructible in this way:
uniform_vector<3, float> my_point(1.0f, 2.1f, 3.2f);
I'm very new to the template (meta)programming scene and I would like
to get better at it, so any advice you could give that would be
instructive in that regard would be much appreciated. The code below
is what I have come up with.
Question 1: Am I reinventing the wheel at all? In other words is there
something I can just typedef to get this functionality?
Question 2: If not, how could I generalize this? Is there a template
metaprogramming way? I'm sure it can be done with the preprocessor but
I'm no good with macros... but then again I'm not much good with
templates either at least not by a boost mailing list standard
anyway. :)
Thanks, Derrick.
// -- uniform_vector.hpp
------------------------------------------------------------------------
#ifndef DJH_UNIFORM_VECTOR_HPP
#define DJH_UNIFORM_VECTOR_HPP
#include
AMDG Derrick Hathaway wrote:
Hello, boost-users, what I am trying to accomplish is a generic collection of N objects of type Type. I need for the N objects to be tightly packed and I would like the collection to be constructible in this way:
uniform_vector<3, float> my_point(1.0f, 2.1f, 3.2f);
I'm very new to the template (meta)programming scene and I would like to get better at it, so any advice you could give that would be instructive in that regard would be much appreciated. The code below is what I have come up with.
Question 1: Am I reinventing the wheel at all? In other words is there something I can just typedef to get this functionality?
Question 2: If not, how could I generalize this? Is there a template metaprogramming way? I'm sure it can be done with the preprocessor but I'm no good with macros... but then again I'm not much good with templates either at least not by a boost mailing list standard anyway. :)
Here's some template code that creates an appropriate tuple type.
#include
AMDG
Derrick Hathaway wrote:
Hello, boost-users, what I am trying to accomplish is a generic collection of N objects of type Type. I need for the N objects to be tightly packed and I would like the collection to be constructible in this way:
uniform_vector<3, float> my_point(1.0f, 2.1f, 3.2f);
I'm very new to the template (meta)programming scene and I would like to get better at it, so any advice you could give that would be instructive in that regard would be much appreciated. The code below is what I have come up with.
Question 1: Am I reinventing the wheel at all? In other words is there something I can just typedef to get this functionality?
Question 2: If not, how could I generalize this? Is there a template metaprogramming way? I'm sure it can be done with the preprocessor but I'm no good with macros... but then again I'm not much good with templates either at least not by a boost mailing list standard anyway. :)
Here's some template code that creates an appropriate tuple type.
#include
#include #include #include #include #include #include <iostream>
// create a sequence of 5 elements typedef boost::mpl::range_c
range; // convert all the elements to float and make the result a fusion vector. typedef boost::mpl::transform > >::type tuple_type; int main() { tuple_type t(0, 1, 2, 3, 4); std::cout << typeid(tuple_type).name() << std::endl; }
In Christ, Steven Watanabe
Thank you, Sir, for your quick response. I just got around to testing
it, and I've run into a snag. a fusion::vector is larger than the sum
of it's parts, and I would like something that is not. In other words:
sizeof(vector
AMDG Derrick Hathaway wrote:
Thank you, Sir, for your quick response. I just got around to testing it, and I've run into a snag. a fusion::vector is larger than the sum of it's parts, and I would like something that is not. In other words:
sizeof(vector
) != sizeof(float) + sizeof(float)
Please create a trac ticket for this. It looks like EBCO is not working properly, because the compiler refuses to allocate two instances of boost::fusion::sequence_root at the same address.
A tuple seems to fit, as I described earlier, but I'm not sure how to generalize this. I've thought that there might be a way to generalize a tuple to provide an interface like my_tuple
using the cons. Any thoughts?
Unfortunately cons doesn't quite work because it it doesn't have the
constructor you want.
You can use the general mpl::inserter to create a specialization of
tuple.
#include
::type tuple_type;
int main() { tuple_type t(0, 1, 2, 3, 4); std::cout << typeid(tuple_type).name() << std::endl; } In Christ, Steven Watanabe
participants (2)
-
Derrick Hathaway
-
Steven Watanabe