Mam następujący MWe:Czy istnieje sposób, aby dopasować zagnieżdżony typ szablonu niejawnie w C++?
#include <iostream>
#include <memory>
class A {
public:
int n = 42;
typedef std::shared_ptr<A> Ptr;
};
template<typename T>
void foo(typename T::Ptr arg) {
std::cout << arg->n << std::endl;
}
template<typename T>
void bar(T arg) {
std::cout << arg.n << std::endl;
}
int main() {
A::Ptr a = A::Ptr(new A());
foo<A>(a); // Can I avoid giving <A> here explicitly.
// foo(a); // does not compile
bar(*a); // after all this does work
return 0;
}
Dla mnie to wygląda tak, jak powinno być również możliwe, aby zadzwonić foo(a)
zamiast foo<A>(a)
. Dlaczego nie jest to możliwe i czy mogę jakoś zmienić definicję foo
, aby było to możliwe?
Zdaję sobie sprawę, że mogę po prostu pominąć ::Ptr
w podpisie, ale nadal chcę mieć dostęp do typu A
bez wskaźnika.
co jest „zakaz kontekst, na który nakłada się "? jak to działa? gdzie to ma zastosowanie? – Ven
To wyjaśnia. Dzięki. –
@Ven W skrócie, dotyczy to sytuacji, gdy kompilator nie ma rozsądnego sposobu wyprowadzenia parametru, który pozostaje zdrowy w przypadku przypadków narożnych i nieograniczonego zestawu typów i wartości. Aby uzyskać bardziej formalne traktowanie, zapoznaj się z rozdziałem 14 standardu C++. – Angew