|
Boost Users : |
Subject: Re: [Boost-users] [boost-users][proto] Types of arguments to operator()
From: Manjunath Kudlur (keveman_at_[hidden])
Date: 2010-05-07 14:26:51
On Fri, May 7, 2010 at 11:10 AM, Eric Niebler <eric_at_[hidden]> wrote:
> On 5/7/2010 10:55 AM, Manjunath Kudlur wrote:
>> Now, given an expression type E, I can say "typename
>> boost::result_of<argtype<0, T0>(const E &)>::type" and it will be
>> either "T0 &" or "const T0 &" depending on how _1 appears in the
>> expression E. Using this, I tried to write an expression wrapper with
>> operator() overloaded as follows :
>>
>> template<typename T0>
>> void operator()(typename boost::result_of<argtype<0, T0>(const Expr
>> &)>::type arg0) const
>> {
>> cout << "arg0 " << arg0 << "\n";
>> }
>>
>> But the compiler fails to find a match with this overloaded version
>> when I write, say, (_1)(10). Is it some fundamental C++ restriction
>> that causes this, or am I missing something?
>
> There's a fundamental restriction. T0 is in a nondeduced context here.
> Imagine a template Int like:
>
> template<typename T> struct Int { typedef int type; };
>
> and used like
>
> template<typename T>
> void foo(typename Int<T>::type) ...
>
> foo(1);
>
> What can the compiler say about T? Any choice will work, so the compiler
> has no way to pick one.
Thanks for the quick response and the nice explanation.
> What you need to do instead is define both const and non-const overloads
> and either use SFINAE to get one to drop out, or else (better, IMO)
> assert within the function that the correct one has been chosen:
That would work, except that I would need 2^n versions for operator()
taking 'n' arguments. (Yay! I discovered the perfect forwarding
problem all by myself :-/).
-- Manjunath http://nonchalantlytyped.net/blog/musings/
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net