$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Dirk Gerrits (dirkg_at_[hidden])
Date: 2002-05-14 07:35:51
Douglas Gregor was kind enough to show me a neat generic programming trick
which
could potentially lead to a much improved Boost.Function in the future:
http://aspn.activestate.com/ASPN/Mail/Message/boost/1201004
However, when I tried something similar out in my own code, MSVC6
complained.
Assuming that I got the code right (please correct me if not), this must be
due
to a MSVC6 deficiency. I wanted to search the mailing list archive for a
solution but I didn't really know what to look for, so forgive me if this
has
been answered already. Here is the code plus MSVC6's complaint:
// Some code roughly copied from arg_tuple_size
// Just for testing
template<int num>
struct char_array
{
char elements[num];
};
template<class R>
char_array<1> arity_helper(R (*)());
template<class R, class A1>
char_array<2> arity_helper(R (*)(A1));
template<class R, class A1, class A2>
char_array<3> arity_helper(R (*)(A1, A2));
// More overloads to be added, including boost::function, etc.
template<class F>
struct arity
{
BOOST_STATIC_CONSTANT(int, value = (sizeof(arity_helper(
F(0) ).elements)-1));
};
template<bool Condition> struct truth { };
template<> struct truth<true> { typedef void* type; };
#define ONLY_CALLABLE_WHEN_ARITY_EQUALS(Functor, Arity) \
truth<(arity<Functor>::value == Arity)>::type = 0
// Is this correct?
template<class F>
void func(F f, ONLY_CALLABLE_WHEN_ARITY_EQUALS(F, 0)) // 'type' : is not a
member of 'truth<0>'
{
std::cout << typeid(F).name() << ": 0 parameters\n";
}
void test() {};
int main()
{
void (*nullary)() = &test;
func(nullary);
return 0;
}
Even though the template argument to truth should be true, MSVC6 complaints
that type is not a member of truth<false>. Is there a known workaround for
this? Or is MSVC6 barred from the potential Boost.Function improvement?
Dirk Gerrits