Я настраиваю функцию шаблона с переменным числом аргументов, чтобы иметь возможность вызывать различные перегрузки функций для определенной серии классов. До сих пор мне удавалось «сломать» компиляцию, когда в функцию передается неподдерживаемый класс, но я хотел бы иметь возможность предоставить действительный запасной вариант для обработки «неподдерживаемого» сценария во время выполнения.
Текущая реализация выглядит следующим образом:
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");
};
EDIT Я забыл указать, что искал решение, также совместимое с C++ 11/14.