Gerhard Fiedler wrote:
> Rui Maciel wrote:
>
>> Gerhard Fiedler wrote:
>>
>>>> Considering that you are willing to output that information without
>>>> any restriction (i.e., output to std::cout) [...]
>>>
>>> I don't know where you get this from. If you mean the code that I posted
>>> in response to Victor,
>> <snip/>
>>
>> It appears you failed to understand what I said,
>
> Given what you again wrote here, it appears that I did understand what
> you meant. It however appears that you fail to consider what I wrote
> about my situation.
You already demonstrated that you were clueless about what I wrote, to the
point that I really doubt you even took the time to actually read it.
>> I was referring to encapsulation, and how you are trying to needlessly
>> jump through hoops to try to defeat the restrictions that you chose
>> to put up, particularly when there are solutions which are obvious
>> and straight-forward.
>
> I have my reasons for those restrictions, and I'm not trying to defeat
> them. You may or may not agree with my reasons, but you don't know them
> and so far you haven't been interested in them. You are trying to look
> at the greater picture, which is a good thing, usually, but not without
> knowing the context.
You presented a set of details which you personally picked after deciding
they were the only relevant aspects which influenced your problem. If you
believe the details you've presented are insufficient to properly analyze
your problem and that you didn't provided the adequate context then I don't
see how your decision to leave out information you deemed relevant should be
used as a basis to condemn and insult others.
In spite of this, if you read the post you wrote then you will notice that
you explicitly stated the following:
1) you wished to define a set of operator<<() to output the content of some
classes to std::ostream
2) you required a definition similar to
std::ostream &operator<<( std::ostream &str, MyClass const &printable );
3) you've came up with a implementation of a template policy pattern by
adding individual print() methods to each class, which you failed to make it
work, and asked for help
4) then, in addition, you asked if there was "another way to avoid having to
define such a global operator<< for every class with ostream support"
In my reply, I explicitly addressed 1), 2) and 4), leaving out 3) as it
represented a needlessly convoluted and, ultimately, unjustifiably laborious
solution to a simple problem with a straight-forward solution.
> In this case, I'm simply interested in the question whether I can
> restrict the template definition of a function to classes that implement
> a given member -- as stated in the OP.
Yes, you can. You just need to implement a template strategy pattern to
wrap your print() methods and add compiler checks to check for their
existence. With C++11, you can implement them like Luca Risolia already
explained, but with previous versions you either implement the relevant type
traits or you need to rely on third-party libraries, such as Boost's
Boost.type_traits.
>> As you manifested an irrational desire to avoid the straight-forward
>> solution, defining operator<<() as friend,
>
> Not sure what you call irrational. Given that you don't know my reasons
> (and have so far shown no desire to know them), how can you judge
> whether this exercise is rational or not?
The people in this newsgroup are only aware of the reasons you presented.
Again, if you believe that you haven't provided enough details for others to
adequately understand your reasons then you should try to do a better job
presenting them, particularly when you believe that others aren't seeing the
full picture due to your inability to show it.
>> and you also exhibited a fixation to employ redundant and useless
>> wrapper functions for what essentially is the definition of a
>> operator<<(),
>
> It seems you forgot my original question. I don't want to employ wrapper
> function/s/, but one single wrapper function. This is one purpose of
> this exercise.
Your template policy pattern is nothing more than a thin wrapper over your
classes' print() method. You yourself defined it as nothing more than:
template < class Printable >
std::ostream &operator<<( std::ostream &stream, Printable const &printable )
{
printable.print( stream );
return stream;
}
I don't believe it is possible to write a thinner wrapper than this.
>> I pointed out the obvious alternative: define the necessary getter
>> functions, define your non-friend operator<<() so that it uses that
>> interface and you won't have to employ friendship declarations.
>
> This is the "standard" solution, and it is used often enough. I know it.
> In this particular case, this is possible but not that desirable.
As you provided no justification or reasoning for this fixation and yet it
appears you don't to steer away from it, do you understand why your decision
has been described as irrational?
> This
> is why I'm trying to see whether I can solve this in the way I asked
> about.
It looks like a case of "give me what I want, not what I asked for".
> If you find this exercise irrational, what is then your participation in
> it? (Not that it's not appreciated, but I have my reasons to do it, and
> for me this is not only rational but also fruitful so far. For you?)
You asked for help and I tried to help you. That's one of the main reasons
people still subscribe to this newsgroup. But, after you posted your
replies, I've realized that that was a mistake.
Rui Maciel