Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6025319
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T04:17:01+00:00 2026-05-23T04:17:01+00:00

In C++, I’m trying to create a specialized point class as a union, like

  • 0

In C++, I’m trying to create a specialized point class as a union, like so:

union point
{
  struct { float x, y, z; };
  float val[3];
  float operator[](unsigned i) { return val[i]; }
};

So that I can access the point as an array or as multiple points, for readability.

However, let’s say that I want to generalise this a bit:

template<unsigned n>
  union point
  {
    struct { float ???; };
    float val[n];
    float operator[](unsigned i) { return val[i]; }
  };

What can I put for ???? I could have x, x, y, x, y, z, or x, y, z, w depending on what n is. Solution? Forward declarations!

template<unsigned n>
  union point
  {
    struct coords;
    float val[n];
    float operator[](unsigned i) { return val[i]; }
  };

template<>
  struct point::coords<3>
  {
    float x, y, z;
  };

// ...

But this doesn’t appear to work. Under the GCC 4.6, it compiles, however, whenever that I try to use the members, like so:

point<3> val;
val.x;

I get the error:

error: ‘union point<3>’ has no member named ‘x’

Even if I change val.x to val.coords::x, I still get the error:

error: ‘union point<3>::coords’ is not a base of ‘union point<3>’

Adding using coords; in the union definition didn’t help, either.

Is there any way to accomplish this under the GCC 4.6? Is there a different method of doing this? Is it even possible?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T04:17:02+00:00Added an answer on May 23, 2026 at 4:17 am

    I would suggest using variadic macro to define your union<N> templates.

    template<unsigned int N>
    union point; // declared and undefined
    
    #define DECLARE_POINT(NUM, ...) \
    template<> \
    union point<NUM> \
    { \
      struct { float __VA_ARGS__; }; \
      float val[NUM]; \
    }
    
    #undef DECLARE_POINT
    

    Having done this, you can simply declare/define your various combinations for coordinates (before #undef in this case):

    DECLARE_POINT(1, x);
    DECLARE_POINT(2, x, y);
    DECLARE_POINT(3, x, y, z);
    

    that is equivalent to,

    template<> union point<1> { struct { float x; }; float val[1]; };
    template<> union point<2> { struct { float x, y; }; float val[2]; };
    template<> union point<3> { struct { float x, y, z; }; float val[3]; };
    

    It can be used in the same way you asked:

    point<3> p;
    p.z = 0;
    

    Also, you can put a cross check using some template trickery (static_assert) to check the number arguments(e.g. 1,2,3,...) match the total argument passed (e.g. x,y,z,...).

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm parsing an RSS feed that has an &#8217; in it. SimpleXML turns this
I am trying to loop through a bunch of documents I have to put
I have some data like this: 1 2 3 4 5 9 2 6
I have a bunch of posts stored in text files formatted in yaml/textile (from
We're building an app, our first using Rails 3, and we're having to build
I have this code: - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock { NSString *someString = [[NSString
I'm making a simple page using Google Maps API 3. My first. One marker

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.