Можно ли вызвать общую функцию foo<T>(T*)
из foo<HasParent T>(T*)
?
Вам необходим какой-то способ различения двух функций, чтобы сделайте это.
Например:
template <typename T> void foo(T);
template <typename T> requires true auto foo(T) -> int;
Второй явно более ограничен, чем первый, для всех T
, поэтому foo(42)
вызывает второе. Но вы можете различать два:
auto unconstrained = static_cast<void(*)(int)>(foo);
Здесь шаблон функции-ограничения возвращает int
, поэтому он не является жизнеспособным кандидатом, а вместо этого мы получаем неограниченный.
В вашем примере оба возвращают int
, поэтому этот конкретный прием не работает. Но ключ в том, что вам нужен какой-то способ разграничения двух шаблонов.
Возможно, лучший способ:
template <typename T, std::monostate M = {}>
void foo(T);
template <typename T> requires true
void foo(T arg) {
foo<T, std::monostate{}>(arg); // calls the unconstrained one
}
Использование monostate
здесь довольно мило, поскольку на самом деле это не меняет количество экземпляров шаблона (есть только один monostate
.. .) foo(42)
вызывает второе, которое вызывает первое. Demo .
Но, возможно, было бы лучше просто добавить новую функцию и заставить как неограниченную, так и ограниченную версию шаблона функции вызывать эту функцию (в том смысле, что она, вероятно, менее крипти c чем monostate
подход).