public: \
const T<Lightweight> & name() const { return member; } \
T<Lightweight> & name() { return member; } \
\
private: \
T<Lightweight> member; \
template<typename... Args> \
void build(const T<Lightweight> & m, const Args &... args) \
{ \
static_assert(!check_args<T<Lightweight>, Args...>() && !check_args<T<!Lightweight>, Args...>(), \
#T " has already been specified"); \
member = m; \
build(args...); \
} \
template<typename... Args> \
void build(const T<!Lightweight> & m, const Args &... args) \
{ \
static_assert(!check_args<T<Lightweight>, Args...>() && !check_args<T<!Lightweight>, Args...>(), \
#T " has already been specified"); \
member = m; \
build(args...); \
}