Я настраиваю шаблонную функцию variadi c, чтобы можно было вызывать различные перегрузки функций для определенной серии c классов. До сих пор я был в состоянии «прервать» компиляцию, когда в функцию передан неподдерживаемый класс, но я хотел бы иметь возможность предоставить допустимый запасной вариант для обработки «неподдерживаемого» сценария во время выполнения.
Текущая реализация выглядит следующим образом:
struct ClassA {};
struct ClassB {};
struct ClassC {};
template<typename T> struct is_my_class : std::false_type {};
template<> struct is_my_class<ClassA> : std::true_type {};
template<> struct is_my_class<ClassB> : std::true_type {};
template<typename T>
constexpr bool is_my_class_v = is_my_class<T>::value;
void runOverload(ClassA c) { printf("ClassA overload\n"); }
void runOverload(ClassB c) { printf("ClassB overload\n"); }
template<typename T, typename = std::enable_if_t<is_my_class_v<T>>>
void run(T myClass)
{
runOverload(myClass);
};
template<typename T, typename... Ts>
void run(T myClass, Ts... classesLeft)
{
run(myClass);
run(classesLeft...);
};
int main()
{
ClassA a;
ClassB b;
ClassC c;
run(a, b); // works
run(c); // does not compile
}
Здесь две наиболее многообещающие (но все еще неудачные) попытки, которые я предпринял, чтобы иметь запасной вариант для run
:
1 - Добавление простого !
перед is_my_class<T>
, что дает мне следующую ошибку: error C2995: 'void run(T)': function template has already been defined
template<typename T, typename = std::enable_if_t<!is_my_class_v<T>>>
void run(T myClass)
{
printf("Not supported\n");
};
2 - Создание более "первичного" определения шаблона, которое приводит к печальному, но очевидному : error C2668: 'run': ambiguous call to overloaded function
template<typename T>
void run(T myClass)
{
printf("Not supported\n");
};
РЕДАКТИРОВАТЬ Я забыл указать, что ищу решение, также совместимое с C ++ 11/14