$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Ian McCulloch (ianmcc_at_[hidden])
Date: 2005-03-19 11:37:50
Peter Dimov wrote:
> Peter Dimov wrote:
>> Ian McCulloch wrote:
>>> Peter Dimov wrote:
>>
>> [...]
>>
>>> I don't get it: can't you detect whether
>>> nested::result<nested(T)>::type exists?  As long as the primary
>>> template of nested::result is defined as an empty struct this should
>>> work fine(?).
>>
>> No, consider what happens when 'nested' is int (*) (), for example.
> 
> Hm, it can't be int (*) (), because result_of will not attempt to look for
> a nested result, but it can be an user-defined type with no nested result,
> or a member named result.
Wouldn't both those cases (no nested result, or a member named result) cause
a substitution failure?
#include <iostream>
struct foo
{
   template <typename T>
   struct result { typedef int type; };
};
struct bar
{
   template <typename T>
   struct result {};
};
struct baz
{
   void result() {}
};
struct bat
{
};
void func(...)
{
   std::cout << "func(...)\n";
}
template <typename T>
typename T::result<T(int)>::type
func(T const& x)
{
   std::cout << "func(T const&)\n";
   return typename T::result<T(int)>::type();
}
int main()
{
   func(foo());
   func(bar());
   func(baz());
   func(bat());
}
This compiles cleanly with g++ 3.3.4 and produces
func(T const&)
func(...)
func(...)
func(...)
Cheers,
Ian