Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Conversion operator that must convert return...

Reply
Thread Tools

Conversion operator that must convert return...

 
 
Noah Roberts
Guest
Posts: n/a
 
      08-30-2011
I am trying to do something like so:

std::tie(x,y) = object;

My initial attempt was something like so:

struct attempt0
{
template < typename ... T >
operator std::tuple<T...> ()
{
return std::tuple<T...>();
}
};

The problem here is that tie returns a tuple of reference types, I
can't just construct and return an empty one. It is assignable from
tuples that have matching non-reference types though so my next naive
attempt was:

struct attempt1
{
template < typename ... T >
operator std::tuple<typename std::remove_reference<T>::type...>()
{
return std::tuple<typename std::remove_reference<T>::type...>();
}
};

This version is of course not recognized though. Third attempt was:

struct attempt2
{
template < typename ... T >
operator std::tuple<T...>()
{
return std::tuple<typename std::remove_reference<T>::type...>();
}
};

I didn't expect this to work and it of course didn't.

Sitting here trying to come up with legal C++ to do what I'm trying
and I can't think of any. Any ideas?
 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      08-30-2011
On 8/30/2011 1:13 PM, Noah Roberts wrote:
> I am trying to do something like so:
>
> std::tie(x,y) = object;
>
> My initial attempt was something like so:
>
> struct attempt0
> {
> template< typename ... T>
> operator std::tuple<T...> ()
> {
> return std::tuple<T...>();
> }
> };
>
> The problem here is that tie returns a tuple of reference types, I
> can't just construct and return an empty one. It is assignable from
> tuples that have matching non-reference types though so my next naive
> attempt was:
>
> struct attempt1
> {
> template< typename ... T>
> operator std::tuple<typename std::remove_reference<T>::type...>()
> {
> return std::tuple<typename std::remove_reference<T>::type...>();
> }
> };
>
> This version is of course not recognized though. Third attempt was:
>
> struct attempt2
> {
> template< typename ... T>
> operator std::tuple<T...>()
> {
> return std::tuple<typename std::remove_reference<T>::type...>();
> }
> };
>
> I didn't expect this to work and it of course didn't.
>
> Sitting here trying to come up with legal C++ to do what I'm trying
> and I can't think of any. Any ideas?


Not that I know much, but it seems that you're trying to guess what your
object is going to be assigned to. That's impossible. Perhaps you
should consider some other syntax altogether. What problem are you
trying to solve?

BTW, a usual solution when you need to return an "empty" reference is to
have a static object [in your class] a reference to which you can return
(and check against) in case you need "an empty one".

V
--
I do not respond to top-posted replies, please don't ask
 
Reply With Quote
 
 
 
 
Gil
Guest
Posts: n/a
 
      08-30-2011
On Aug 30, 1:13*pm, Noah Roberts <(E-Mail Removed)> wrote:
> I am trying to do something like so:
>
> std::tie(x,y) = object;
>
> My initial attempt was something like so:
>
> struct attempt0
> {
> * template < typename ... T >
> * operator std::tuple<T...> ()
> * {
> * * return std::tuple<T...>();
> * }
>
> };
>
> The problem here is that tie returns a tuple of reference types, I
> can't just construct and return an empty one. *It is assignable from
> tuples that have matching non-reference types though so my next naive
> attempt was:
>
> struct attempt1
> {
> * template < typename ... T >
> * operator std::tuple<typename std::remove_reference<T>::type...>()
> * {
> * * return std::tuple<typename std::remove_reference<T>::type...>();
> * }
>
> };
>
> This version is of course not recognized though. *Third attempt was:
>
> struct attempt2
> {
> * template < typename ... T >
> * operator std::tuple<T...>()
> * {
> * * return std::tuple<typename std::remove_reference<T>::type...>();
> * }
>
> };
>
> I didn't expect this to work and it of course didn't.
>
> Sitting here trying to come up with legal C++ to do what I'm trying
> and I can't think of any. *Any ideas?


you have to *add* reference to match the tie decl type... see below.

/**
* @file: tie_test.cpp
* @author: gil
* Distributed under the Boost Software License, Version 1.0.
*/

#include <tuple>
#include <iostream>
#include <functional>

template< typename X, typename Y >
struct object {
object( X const & x, Y const & y ) : x( x ), y( y ) { }
operator std::tuple< X&, Y& >() {
return std::make_tuple( std::ref( x ), std::ref( y ) );
}
X x; Y y;
};

int main( ) {

object< int, int > c0( 0, 1 );
int i, d;
std::tie( i, d ) = c0; /* problem solved */
std::cout << i << " " << d << std::endl;

}
 
Reply With Quote
 
Noah Roberts
Guest
Posts: n/a
 
      08-30-2011
On Aug 30, 3:24*pm, Gil <(E-Mail Removed)> wrote:
> On Aug 30, 1:13*pm, Noah Roberts <(E-Mail Removed)> wrote:
> > I am trying to do something like so:

>
> > std::tie(x,y) = object;

>
> > My initial attempt was something like so:

>
> > struct attempt0
> > {
> > * template < typename ... T >
> > * operator std::tuple<T...> ()
> > * {
> > * * return std::tuple<T...>();
> > * }

>
> > };

>
> > The problem here is that tie returns a tuple of reference types, I
> > can't just construct and return an empty one. *It is assignable from
> > tuples that have matching non-reference types though so my next naive
> > attempt was:

>
> > struct attempt1
> > {
> > * template < typename ... T >
> > * operator std::tuple<typename std::remove_reference<T>::type...>()
> > * {
> > * * return std::tuple<typename std::remove_reference<T>::type...>();
> > * }

>
> > };

>
> > This version is of course not recognized though. *Third attempt was:

>
> > struct attempt2
> > {
> > * template < typename ... T >
> > * operator std::tuple<T...>()
> > * {
> > * * return std::tuple<typename std::remove_reference<T>::type...>();
> > * }

>
> > };

>
> > I didn't expect this to work and it of course didn't.

>
> > Sitting here trying to come up with legal C++ to do what I'm trying
> > and I can't think of any. *Any ideas?

>
> you have to *add* reference to match the tie decl type... see below.
>
> /**
> ** @file: * tie_test.cpp
> ** @author: gil
> ** Distributed under the Boost Software License, Version 1.0.
> **/
>
> #include <tuple>
> #include <iostream>
> #include <functional>
>
> template< typename X, typename Y >
> struct object {
> * object( X const & x, Y const & y ) : x( x ), y( y ) { }
> * operator std::tuple< X&, Y& >() {
> * * return std::make_tuple( std::ref( x ), std::ref( y ) );


What if x & y are calculated?

> * }
> * X x; Y y;
>
> };
>
> int main( ) {
>
> * object< int, int > c0( 0, 1 );
> * int i, d;
> * std::tie( i, d ) = c0; /* problem solved */
> * std::cout << i << " " << d << std::endl;
> }


 
Reply With Quote
 
SG
Guest
Posts: n/a
 
      08-31-2011
On 30 Aug., 19:13, Noah Roberts wrote:
>
> I am trying to do something like so:
>
> std::tie(x,y) = object;
>
> [object is not a tuple but of another custom type I'm writing]
>
> Sitting here trying to come up with legal C++ to do what I'm trying
> and I can't think of any. *Any ideas?


Why are the conversion operators in all your attempts templates? Why
do you try to default-construct the resulting tuples? What is it, that
you are actually trying to do here?

There are only two non-template assignment operators of tuple<>. And
these are the only ones that the compiler will consider. So, you
provide a conversion to that specific tuple type, or you don't do it
at all. operator= has to be a non-static member. So, you also can't
provide your own one as a free function.

Alternatives:
(1) assign(tie(x,y),object);
(2) tie(x,y) = object.as_tuple();

Whether 2 works for you, I don't know. As I said, I don't understand
why you would want your conversion operator to be a template.

SG
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
problem in running a basic code in python 3.3.0 that includes HTML file Satabdi Mukherjee Python 1 04-04-2013 07:48 PM
operator << and conversion operator cronusf C++ 12 10-28-2010 09:21 AM
conversion operator and conversion ctor subramanian100in@yahoo.com, India C++ 2 09-15-2009 12:46 PM
user defined conversion operator or operator overloading? hurcan solter C++ 3 08-29-2007 07:39 PM
<complex> : no match for 'operator*' // conversion operator double() Arvid Requate C++ 2 06-23-2006 10:41 AM



Advertisments