
Hicham Mouline <hicham@mouline.org> wrote:
Is it possible to define some member functions conditionally on integral template argument values?
template <int n> class C { void f1(); void f2(); .... void f6(); // should be a member only if n==3 for e.g. };
I could specialize this template and then i would have to define f1..5() for both the general case and the special case(n==3).
It has been my experience that you don't generally need to worry about deleting member functions like this. If the body of f6 won't compile for certain values of the template arguments, and you don't call it for those arguments, then the compiler won't give an error. If you want to clean up the error messages for cases where you do try to call it when you shouldn't, or if it compiles but doesn't make sense, you could put a BOOST_STATIC_ASSERT at the start of f6's body, next to a comment explaining what template arguments make the function valid. For example, this sample program compiles using vc8sp1: // Begin sample #include <boost/static_assert.hpp> template <int n> struct C { void f1() { //Force a compiler error if n != 3 BOOST_STATIC_ASSERT (n == 3); } }; int main() { C<3> c1; c1.f1(); C<2> c2; // c2.f1(); //Works fine as long as this line remains commented out } // End sample If it really is critical that f6 be deleted, then the only way I can think of is to put it in a base class and use a template metafunction to conditionally derive class C from that base class or an empty base class.