|
Boost Users : |
Subject: Re: [Boost-users] mpl / preprocessor question
From: Roman Perepelitsa (roman.perepelitsa_at_[hidden])
Date: 2009-06-29 05:25:06
2009/6/28 Zachary Turner <divisortheory_at_[hidden]>
> Is there a way, using some combination of boost preprocessor and mpl,
> that I can write a class
>
> template<class T, int n>
> class foo
> {
> public:
>
> void foo(T arg1, T arg2, ..., T argn);
> };
>
> In other words, generate a function that requires n arguments where n
> is a template parameter?
>
Using preprocessor you can generate a set of functions taking from 0 to M
(some predefined constant) arguments. Inside of these functions static
assert that number of arguments is equal to n. If a caller calls a function
with wrong number of arguments, the compile error will occur, which is
exactly what you need.
#include <iostream>
#include <boost/preprocessor.hpp>
#include <boost/static_assert.hpp>
#define M 10
template <class T, int N>
struct foo {
#define BOOST_PP_LOCAL_MACRO(Q) \
void bar(BOOST_PP_ENUM_PARAMS(Q, T arg)) { \
BOOST_STATIC_ASSERT(Q == N); \
std::cout << "I'm bar's body" << std::endl; \
}
#define BOOST_PP_LOCAL_LIMITS (0, M)
#include BOOST_PP_LOCAL_ITERATE()
};
int main() {
foo<int, 2> f;
f.bar(1, 2); // Works.
f.bar(1, 2, 3); // Does not work.
}
Roman Perepelitsa.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net