Re: Is it possible to limit the template argument to a few class types?
fabio_cannizzo@yahoo.com wrote:
class A {};
class B {};
class C {};
template <class A1, class A2>
MyClass<A1,A2> operator +( const A1&, const A2& ) {}
Here, both template arguments A1 and A2 can be either of type A,
B or C, but nothing else.
As soon as I write the code above, it clashes with other similar
template functions declared, for istance, in STL iterators, and
the compiler get confused at which one it should use.
#include <boost/mpl/size.hpp>
#include <boost/mpl/copy.hpp>
#include <boost/mpl/insert.hpp>
#include <boost/mpl/inserter.hpp>
#include <boost/mpl/equal_to.hpp>
namespace mpl = boost::mpl;
template<class S, class T> struct union_of
: mpl::copy<S, mpl::inserter<T, mpl::insert<mpl::_1, mpl::_2> > > {};
template<class S, class T> struct is_subset
: mpl::equal_to<mpl::size<typename union_of<S,T>::type>, mpl::size<T> > {};
#include <iostream>
#include <iomanip>
#include <cassert>
#include <vector>
#include <boost/mpl/set.hpp>
#include <boost/utility/enable_if.hpp>
template<class, class> class MyClass {};
class A {};
class B {};
class C {};
template<class A1, class A2>
typename boost::enable_if<
is_subset<boost::mpl::set<A1,A2>, boost::mpl::set<A,B,C> >,
MyClass<A1,A2> >::type
operator +( const A1&, const A2& ) { return MyClass<A1,A2>(); }
int main()
{
std::vector<B> v(3);
std::vector<B>::iterator i = v.begin() + 2;
MyClass<A,B> ab = A() + B();
MyClass<A,C> ac = A() + C();
MyClass<B,C> bc = B() + C();
std::cout << std::endl;
std::cin.get();
return 0;
}
Martin
--
Quidquid latine scriptum est, altum videtur.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]