Могу ли я перегружать функции тип-чертами?
Позволять'скажем, у меня есть шесть типов, и каждый из них принадлежит к концептуальной категории.
Вот диаграмма, которая показывает это:
Или, возможно, более конкретный пример для вас:
Я хочу написать две функции, которые будут обрабатывать все 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;
}