Могу ли я перегружать функции тип-чертами?

Позволять'скажем, у меня есть шесть типов, и каждый из них принадлежит к концептуальной категории.

Вот диаграмма, которая показывает это:

Или, возможно, более конкретный пример для вас:

Я хочу написать две функции, которые будут обрабатывать все 6 типов.

Типы в "Категория 1 " обрабатываются определенным образом, и вводит "Категория 2 " обрабатываются по-другому.

Позволять's попасть в код. Сперва я'Я создам шесть типов.

//Category 1 Types
class Type_A{};
class Type_B{};
class Type_C{};

//Category 2 Types
class Type_D{};
class Type_E{};
class Type_F{};

Далее яЯ создам две черты типа, так что категория типа может быть обнаружена во время компиляции.

/* Build The Category 1 Type Trait */

//Type_A Type Trait
template 
struct Is_Type_A {
  static const bool value = false;
};
template 
struct Is_Type_A {
  static const bool value = true;
};

//Type_B Type Trait
template 
struct Is_Type_B {
  static const bool value = false;
};
template 
struct Is_Type_B {
  static const bool value = true;
};

//Type_C Type Trait
template 
struct Is_Type_C {
  static const bool value = false;
};
template 
struct Is_Type_C {
  static const bool value = true;
};

//Category 1 Type Trait
template 
struct Is_Type_From_Category_1 {
  static const bool value = Is_Type_A::value || Is_Type_B::value || Is_Type_C::value;
};

/* Build The Category 2 Type Trait */

//Type_D Type Trait
template 
struct Is_Type_D {
  static const bool value = false;
};
template 
struct Is_Type_D {
  static const bool value = true;
};

//Type_E Type Trait
template 
struct Is_Type_E {
  static const bool value = false;
};
template 
struct Is_Type_E {
  static const bool value = true;
};

//Type_F Type Trait
template 
struct Is_Type_F {
  static const bool value = false;
};
template 
struct Is_Type_F {
  static const bool value = true;
};

//Category 1 Type Trait
template 
struct Is_Type_From_Category_2 {
  static const bool value = Is_Type_D::value || Is_Type_E::value || Is_Type_F::value;
};

Теперь, когда у меня есть две черты типа, чтобы различать, к какой категории относится каждый из шести типов, я хочу написать две функции. Одна функция будет принимать все из категории 1, а другая функция будет принимать все из категории 2. Есть ли способ сделать это без создания какой-либо диспетчерской функции? Могу ли я найти способ иметь только две функции; один для каждой категории?

РЕДАКТИРОВАТЬ: Я попытался использовать enable_if, как это, но такая попытка приведет к ошибке компилятора.

//Handle all types from Category 1
template
void function(T t){
    //do category 1 stuff to the type
    return;
}

//Handle all types from Category 2
template
void function(T t){
    //do category 2 stuff to the type
    return;
}

Редактировать 2: ямы пробовали код, указанный в ссылке, но это не такt да или нет решение о том, вызывать или нет функцию. Это'с какой функцией я вызываю, учитывая две черты типа. Это было бы ошибкой переопределения.

//Handle all types from Category 2
template
void function(T t){
    //do category 1 stuff to the type
    return;
}
//Handle all types from Category 2
template
void function(T t){
    //do category 2 stuff to the type
    return;
}

Ответы на вопрос(4)

Ваш ответ на вопрос