Обратите внимание, что это будет ошибкой даже без шаблонов, например, если ваши классы не были шаблонами:
struct Base {
void foo();
};
struct Derived : Base {};
Вы по-прежнему не можете сделать foo<Base>()
: https://ideone.com/MQE0ff
Возможное альтернативное решение будет включать, во-первых, для упрощения, вместо того, чтобы брать 2 параметра шаблона, которые у меня будут bar
использовать тип параметра шаблона auto
:
template<auto thing>
struct bar{};
Затем нам нужно реализовать is_specialization_of
:
template<template<typename...> class T, typename U>
struct is_specialization_of : std::false_type {};
template<template<typename...> class T, typename... Ts>
struct is_specialization_of<T, T<Ts...>> : std::true_type {};
Теперь мы можем переписать foo
, чтобы использовать is_specialization_of
, мы можем определить, передали ли мы специализацию Base
или другой класс (которыймы предполагаем, что это происходит из Base
специализации.)
template<typename T>
void foo()
{
conditional_t<is_specialization_of<Base, T>::value, bar<&T::foo>, bar<&Base<T>::foo>>{};
}
Я немного расширил ваш пример, чтобы фактически вызвать thing
в bar
, и просто включил мои предложения.Вы можете проверить это здесь: https://coliru.stacked -crooked.com / a / 2a33b8bd38896ff5