Множество определений объясняется тем, что вам нужно либо добавить ключевое слово inline
, либо вставить реализацию ваших специализаций в файл cpp, оставив только объявления таких в заголовке.
Возможно, вы могли бы использовать mpl :: map для написания родовой версии. Примерно так:
struct A {};
struct B {};
struct C {};
enum Value { a,b,c };
template < typename T >
Value get_value()
{
using namespace boost::mpl;
typedef mpl::map
<
mpl::pair< A, mpl::int_<a> >
, mpl::pair< B, mpl::int_<b> >
, mpl::pair< C, mpl::int_<c> >
> type_enum_map;
typedef typename mpl::at<type_enum_map, T>::type enum_wrap_type;
return static_cast<Value>(enum_wrap_type::value);
}