Supponiamo di avere una sicurezza di classe come segue:Ottenere il tipo di valore di archiviazione appropriato?
struct Base {}
template<typename T>
struct Box : Base
{
template<typename... Args>
Box(Args&&... args)
: t(forward<Args>(args)...)
{}
T t;
}
E poi abbiamo una funzione di makebox:
template<typename X>
Base* MakeBox(X&& x)
{
return new Box<???>(forward<X>(x));
}
Il tipo X
è dedotta da parametro utilizzato nella chiamata a makebox.
Abbiamo poi bisogno di calcolare in qualche modo da X appropriato "tipo di archiviazione" parametro T.
Penso che se abbiamo appena ingenuamente utilizziamo:
return new Box<X>(forward<X>(x));
allora questo causerà problemi.
Chiaramente std::bind
e std::function
devono occuparsi di questi problemi, come fanno?
È std::decay
utile in ogni caso qui?
Non è ['std :: remove_reference'] (http://en.cppreference.com/w/cpp/types/remove_reference) che cosa stai cercando? –
jogojapan
@jogojapan: è ciò che 'std :: bind' usa per memorizzare i suoi parametri associati? –
'std :: decay' è esattamente quello che stai cercando. – Mankarse