digitalmars.D - Variable template parameters count (static for)
- Victor Nakoryakov (90/90) Jul 02 2005 Hi all.
Hi all.
Maybe it is inappropriate to the current occasion to make proposals: I
think my post will be lost in mutable / immutable / mutable / immutable
/ notmutable posts but anyway... :)
Time after time as well in C++ as in D I have to do one very very
tedious thing. This is hard to explain with words, so I'll try to
explain with example:
inline MessageLayout _gl0()
{
MessageLayout ret;
return ret;
}
template <typename T0>
inline MessageLayout _gl1()
{
MessageLayout ret;
ret.Push<T0>();
return ret;
}
template <typename T0, typename T1>
inline MessageLayout _gl2()
{
MessageLayout ret;
ret.Push<T0>();
ret.Push<T1>();
return ret;
}
....
template <typename T0, typename T1, typename T2, typename T3, typename
T4, typename T5, typename T6, typename T7>
inline MessageLayout _gl8()
{
MessageLayout ret;
ret.Push<T0>();
ret.Push<T1>();
ret.Push<T2>();
ret.Push<T3>();
ret.Push<T4>();
ret.Push<T5>();
ret.Push<T6>();
ret.Push<T7>();
return ret;
}
////
template <typename T0>
void Handle(DWORD id, Closure<void(const ReceiverAgent&, T0)> handler)
{
if (id != m_title)
return;
if (m_content->Layout() != _gl1<T0>())
{
COMMON_ASSERT(0, "Incompatible message layout and handler signature");
return;
}
TMessage1<T0>* content = reinterpret_cast<TMessage1<T0>*>(m_content);
handler(m_agent, content->p0);
}
...
template <typename T0, typename T1, typename T2, typename T3, typename
T4, typename T5, typename T6, typename T7>
void Handle(DWORD id, Closure<void(const ReceiverAgent&, T0, T1, T2,
T3, T4, T5, T6, T7)> handler)
{
if (id != m_title)
return;
if (m_content->Layout() != _gl8<T0, T1, T2, T3, T4, T5, T6, T7>())
{
COMMON_ASSERT(0, "Incompatible message layout and handler signature");
return;
}
TMessage8<T0, T1, T2, T3, T4, T5, T6, T7>* content =
reinterpret_cast<TMessage8<T0, T1, T2, T3, T4, T5, T6, T7>*>(m_content);
handler(m_agent, content->p0, content->p1, content->p2, content->p3,
content->p4, content->p5, content->p6, content->p7);
}
I think you found pattern. Thi is C++ just because I could copy/paste it
and not to write example in D, but the essense is the same.
I have to generate nearly similiar classes with only difference in count
of template parameters. So suggestion is to make, hm... `static for
(;;)` and make ability to declare template a-la:
template (SomeT, AnotherT, T[] ...)
What can you say about this?
--
Victor (aka nail) Nakoryakov
nail-mail<at>mail<dot>ru
Krasnoznamensk, Moscow, Russia
Jul 02 2005








Victor Nakoryakov <nail-mail mail.ru>