Casting from const pair<const unsigned char*, size_t>* to constpair<unsigned char*, size_t>*

Discussion in 'C++' started by Alex Vinokur, Oct 12, 2008.

  1. Alex Vinokur

    Alex Vinokur Guest

    Hi,

    Is it possible to do C++-casting from
    const pair<const unsigned char*, size_t>*
    to
    const pair<unsigned char*, size_t>*
    ?

    Alex Vinokur
     
    Alex Vinokur, Oct 12, 2008
    #1
    1. Advertising

  2. On 2008-10-12 13:16, Alex Vinokur wrote:
    > Hi,
    >
    > Is it possible to do C++-casting from
    > const pair<const unsigned char*, size_t>*
    > to
    > const pair<unsigned char*, size_t>*
    > ?


    const_cast might work, but I don't think this counts as casting away
    constness, you should probably use reinterpret_cast.

    --
    Erik Wikström
     
    Erik Wikström, Oct 12, 2008
    #2
    1. Advertising

  3. Alex Vinokur

    Barry Guest

    On Oct 12, 7:16 pm, Alex Vinokur <> wrote:
    > Hi,
    >
    > Is it possible to do C++-casting from
    > const pair<const unsigned char*, size_t>*
    > to
    > const pair<unsigned char*, size_t>*
    > ?
    >


    const pair<const unsigned char*, size_t>* p1 = 0;
    const pair<unsigned char*, size_t>* p2 =
    reinterpret_cast<const pair<unsigned char*, size_t>*>(p1);

    but reinterpre_cast should be avoided if possible.
    *Practically*, I wonder you can just do it this way:

    char* s = const_cast<char*>(p1->first);

    Or can you tell me the scenario you are in?

    --
    Best Regards
    Barry
     
    Barry, Oct 12, 2008
    #3
  4. Alex Vinokur

    Alex Vinokur Guest

    On Oct 12, 2:22 pm, Barry <> wrote:
    > On Oct 12, 7:16 pm, Alex Vinokur <> wrote:
    >
    > > Hi,

    >
    > > Is it possible to do C++-casting from
    > > const pair<const unsigned char*, size_t>*
    > > to
    > > const pair<unsigned char*, size_t>*
    > > ?

    >
    >   const pair<const unsigned char*, size_t>* p1 = 0;
    >   const pair<unsigned char*, size_t>* p2 =
    >         reinterpret_cast<const pair<unsigned char*, size_t>*>(p1);
    >
    > but reinterpre_cast should be avoided if possible.
    > *Practically*, I wonder you can just do it this way:
    >
    >   char* s = const_cast<char*>(p1->first);
    >
    > Or can you tell me the scenario you are in?
    >


    I have function foo1 (const pair<unsigned char*, size_t>* p);
    I need also function foo2 (const pair<const unsigned char*, size_t>*
    p) that does the same thing as foo1().

    Currently
    void foo2 (const pair<const unsigned char*, size_t>* p)
    {
    // I would like to use here C++-style casting
    const pair<unsigned char*, size_t>* p1 = ( const pair<unsigned
    char*, size_t>* ) p;
    foo1(p1);
    }

    Alex Vinokur
     
    Alex Vinokur, Oct 12, 2008
    #4
  5. Alex Vinokur

    Barry Guest

    On Oct 12, 9:05 pm, Alex Vinokur <> wrote:
    > On Oct 12, 2:22 pm, Barry <> wrote:
    >
    >
    >
    > > On Oct 12, 7:16 pm, Alex Vinokur <> wrote:

    >
    > > > Hi,

    >
    > > > Is it possible to do C++-casting from
    > > > const pair<const unsigned char*, size_t>*
    > > > to
    > > > const pair<unsigned char*, size_t>*
    > > > ?

    >
    > >   const pair<const unsigned char*, size_t>* p1 = 0;
    > >   const pair<unsigned char*, size_t>* p2 =
    > >         reinterpret_cast<const pair<unsigned char*, size_t>*>(p1);

    >
    > > but reinterpre_cast should be avoided if possible.
    > > *Practically*, I wonder you can just do it this way:

    >
    > >   char* s = const_cast<char*>(p1->first);

    >
    > > Or can you tell me the scenario you are in?

    >
    > I have function foo1 (const pair<unsigned char*, size_t>* p);
    > I need also function foo2 (const pair<const unsigned char*, size_t>*
    > p) that does the same thing as foo1().
    >
    > Currently
    > void foo2 (const pair<const unsigned char*, size_t>* p)
    > {
    >   // I would like to use here C++-style casting
    >   const pair<unsigned char*, size_t>* p1 = ( const pair<unsigned
    > char*, size_t>* ) p;
    >   foo1(p1);
    >
    > }
    >


    I'm sorry that my previous post misled you.
    I think sam got my answer.

    What I asked is that I was confused that why you need
    such conversion. And I was expecting to see if there's some
    way to avoid such conversion.

    If you just wanted to learn the language. OK, "reinterpret_cast"
    as C++-style cast, or just use C-style cast. While in practice,
    avoid doing this.

    --
    Best Regards
    Barry
     
    Barry, Oct 12, 2008
    #5
  6. Alex Vinokur

    peter koch Guest

    On 12 Okt., 13:16, Alex Vinokur <> wrote:
    > Hi,
    >
    > Is it possible to do C++-casting from
    > const pair<const unsigned char*, size_t>*
    > to
    > const pair<unsigned char*, size_t>*
    > ?
    >
    > Alex Vinokur


    Only a reinterpret_cast works: the two types are unrelated. Why do you
    want to do this? It would be better to fix your design instead.

    /Peter
     
    peter koch, Oct 12, 2008
    #6
  7. Alex Vinokur

    James Kanze Guest

    On Oct 12, 4:08 pm, peter koch <> wrote:
    > On 12 Okt., 13:16, Alex Vinokur <> wrote:
    > > Is it possible to do C++-casting from
    > > const pair<const unsigned char*, size_t>*
    > > to
    > > const pair<unsigned char*, size_t>*
    > > ?


    > Only a reinterpret_cast works: the two types are unrelated.
    > Why do you want to do this? It would be better to fix your
    > design instead.


    Reinterpret_cast doesn't work. You can't do a reinterpret_cast
    to or from a user defined type, and instantiations of std::pair
    are considered user defined types.

    What he can do is construct a new std::pair, e.g.:

    std::pair< unsigned char*, size_t > const p2
    = std::make_pair(
    const_cast< unsigned char* >( p1.first ),
    p2.second ) ;

    --
    James Kanze (GABI Software) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
     
    James Kanze, Oct 13, 2008
    #7
  8. On Oct 12, 2:05 pm, Alex Vinokur <> wrote:
    > I have function foo1 (const pair<unsigned char*, size_t>* p);
    > I need also function foo2 (const pair<const unsigned char*, size_t>*
    > p) that does the same thing as foo1().


    template <class T>
    void foo_impl (const pair <T, size_t>* p) {...}

    typedef pair <const unsigned char*, size_t> pair1;
    typedef pair <unsigned char*, size_t> pair2;

    void foo1 (const pair1* p) {foo_impl (p);}
    void foo2 (const pair2* p) {foo_impl (p);}

    Regards,
    Vidar Hasfjord
     
    Vidar Hasfjord, Oct 13, 2008
    #8
  9. On 2008-10-13 11:27, James Kanze wrote:
    > On Oct 12, 4:08 pm, peter koch <> wrote:
    >> On 12 Okt., 13:16, Alex Vinokur <> wrote:
    >> > Is it possible to do C++-casting from
    >> > const pair<const unsigned char*, size_t>*
    >> > to
    >> > const pair<unsigned char*, size_t>*
    >> > ?

    >
    >> Only a reinterpret_cast works: the two types are unrelated.
    >> Why do you want to do this? It would be better to fix your
    >> design instead.

    >
    > Reinterpret_cast doesn't work. You can't do a reinterpret_cast
    > to or from a user defined type, and instantiations of std::pair
    > are considered user defined types.


    He wanted to cast from a pointer to a user defined type to a pointer to
    another user defined type, which is allowed.

    --
    Erik Wikström
     
    Erik Wikström, Oct 13, 2008
    #9
  10. Alex Vinokur

    James Kanze Guest

    On Oct 13, 5:48 pm, Erik Wikström <> wrote:
    > On 2008-10-13 11:27, James Kanze wrote:
    >
    > > On Oct 12, 4:08 pm, peter koch <> wrote:
    > >> On 12 Okt., 13:16, Alex Vinokur <> wrote:
    > >> > Is it possible to do C++-casting from
    > >> > const pair<const unsigned char*, size_t>*
    > >> > to
    > >> > const pair<unsigned char*, size_t>*
    > >> > ?


    > >> Only a reinterpret_cast works: the two types are unrelated.
    > >> Why do you want to do this? It would be better to fix your
    > >> design instead.


    > > Reinterpret_cast doesn't work. You can't do a reinterpret_cast
    > > to or from a user defined type, and instantiations of std::pair
    > > are considered user defined types.


    > He wanted to cast from a pointer to a user defined type to a
    > pointer to another user defined type, which is allowed.


    Yep. I missed the trailing * in the original posting. In that
    case, you can use reinterpret_cast to replace a compile time
    error with runtime undefined behavior. Otherwise, you do need
    to create a new object, using the technique I described.

    (Also, it seems sort of strange to have pointers to an
    std::pair. The object definitely has value semantics.)

    --
    James Kanze (GABI Software) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
     
    James Kanze, Oct 13, 2008
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Timo Freiberger
    Replies:
    3
    Views:
    996
    Bob Hairgrove
    Oct 30, 2004
  2. Replies:
    24
    Views:
    906
    Netocrat
    Oct 30, 2005
  3. lovecreatesbeauty
    Replies:
    1
    Views:
    1,152
    Ian Collins
    May 9, 2006
  4. =?gb2312?B?wNbA1rTzzOzKpg==?=
    Replies:
    26
    Views:
    6,646
    Ian Collins
    Jan 30, 2007
  5. Replies:
    11
    Views:
    1,152
Loading...

Share This Page