I would remove the getParam
that doesn't match to avoid ambiguity as follow: Demo
template <class ... Params> class Parameter;
template <class Param>
class Parameter<Param> : public Param
{
public:
//! Get a parameter
template <class Param2>
typename std::enable_if<std::is_same<Param, Param2>::value, int>::type
getParam() const
{ return Param::x; }
};
template <class Param, class ... Tail>
class Parameter<Param, Tail ...> : public Parameter<Param>, Parameter<Tail...>
{
public:
using Parameter<Param>::getParam;
using Parameter<Tail...>::getParam;
};
class Base : public Parameter<A, B> {};
class Derived : public Base, public Parameter<C, D>
{
public:
using Base::getParam;
using Parameter<C, D>::getParam;
};