Предположим, у меня есть шесть типов, и каждый из них принадлежит к концептуальной категории.
Вот диаграмма, которая показывает это:Могу ли я перегружать функции с характерными чертами?
Или Возможно, более конкретный пример для вас:
Я хочу написать две функции, которые будут обрабатывать все 6 типов.
Типы в категории «1» обрабатываются определенным образом, а типы в «Категории 2» обрабатываются по-другому.
Перейдем к коду. Во-первых, я создам шесть типов.
//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 <typename T>
struct Is_Type_A {
static const bool value = false;
};
template <>
struct Is_Type_A<Type_A> {
static const bool value = true;
};
//Type_B Type Trait
template <typename T>
struct Is_Type_B {
static const bool value = false;
};
template <>
struct Is_Type_B<Type_B> {
static const bool value = true;
};
//Type_C Type Trait
template <typename T>
struct Is_Type_C {
static const bool value = false;
};
template <>
struct Is_Type_C<Type_C> {
static const bool value = true;
};
//Category 1 Type Trait
template <typename T>
struct Is_Type_From_Category_1 {
static const bool value = Is_Type_A<T>::value || Is_Type_B<T>::value || Is_Type_C<T>::value;
};
/* Build The Category 2 Type Trait */
//Type_D Type Trait
template <typename T>
struct Is_Type_D {
static const bool value = false;
};
template <>
struct Is_Type_D<Type_D> {
static const bool value = true;
};
//Type_E Type Trait
template <typename T>
struct Is_Type_E {
static const bool value = false;
};
template <>
struct Is_Type_E<Type_E> {
static const bool value = true;
};
//Type_F Type Trait
template <typename T>
struct Is_Type_F {
static const bool value = false;
};
template <>
struct Is_Type_F<Type_F> {
static const bool value = true;
};
//Category 1 Type Trait
template <typename T>
struct Is_Type_From_Category_2 {
static const bool value = Is_Type_D<T>::value || Is_Type_E<T>::value || Is_Type_F<T>::value;
};
Теперь у меня есть две черты типа, чтобы отличить, к какой категории каждый из шести типов попадают в, я хочу написать две функции. Одна функция будет принимать все из категории 1, а другая функция будет принимать все из категории 2. Есть ли способ сделать это без создания какой-либо функции диспетчеризации? Могу ли я найти способ иметь только две функции; по одному для каждой категории?
EDIT: Я пытался использовать enable_if, как это, но такая попытка приведет к ошибке компиляции.
//Handle all types from Category 1
template<class T ,class = typename std::enable_if<Is_Type_From_Category_1<T>::value>::type >
void function(T t){
//do category 1 stuff to the type
return;
}
//Handle all types from Category 2
template<class T ,class = typename std::enable_if<Is_Type_From_Category_2<T>::value>::type >
void function(T t){
//do category 2 stuff to the type
return;
}
Edit 2: Я попытался код, предоставленный в ссылке, но это не да или нет решения о том, следует ли вызвать функцию. Это функция, которую я вызываю, учитывая две черты типа. Это будет ошибкой переопределения.
//Handle all types from Category 2
template<class T, class dummy = typename std::enable_if< Is_Type_From_Category_1<T>::value, void>::type>
void function(T t){
//do category 1 stuff to the type
return;
}
//Handle all types from Category 2
template<class T, class dummy = typename std::enable_if< Is_Type_From_Category_2<T>::value, void>::type>
void function(T t){
//do category 2 stuff to the type
return;
}
Возможный дубликат [Общие сведения о SFINAE] (http://stackoverflow.com/questions/17829874/understanding-sfinae) – Potatoswatter
@Potatoswatter правильно, но я не думаю, что могу перегружать с характерной чертой? Сначала они должны быть обнаружены истинными или ложными; что означало бы, что я должен отправить? –
См. Связанные вопросы и ответы. Действительно ли 'enable_if' не совсем то, что вы ищете? – Potatoswatter