|
Boost : |
Subject: [boost] [parameter] Preventing instantiation of lazy binding operator() until default is needed
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2009-05-29 14:08:31
This is a subset of my previous email, with a more specific and concrete
example. The following code:
#include <boost/parameter/name.hpp>
#include <boost/parameter/binding.hpp>
BOOST_PARAMETER_NAME(my_param)
template <typename T> struct s {};
template <typename T>
struct bogus {
typedef typename s<T>::type result_type;
template <typename U> struct result: public s<U> {};
result_type operator()() const {return 0;}
};
template <typename ArgPack>
void f(const ArgPack& ap) {
const char* cs = ap[_my_param || bogus<const char*>()];
}
int main(int, char**) {
f(_my_param = "foo");
return 0;
}
does not work because result_type is invalid when the struct bogus is
instantiated when creating the default value used in operator||(). If
operator()() was a template, I think the compiler would delay
instantiating it until it was called. Is there a way to force
operator()() to be a template in Boost.Parameter, allowing its return type
to only be instantiated when Boost.Parameter knows that the default will
be used? This is a simplified example from a larger piece of code where
the lazy default does not have a valid return type in some cases, and the
parameter must be explicitly specified in those cases. Thank you.
-- Jeremiah Willcock
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk