Mi sembra che in C ++ 11 sia stata prestata molta attenzione a semplificare i valori di ritorno da funzioni e metodi, ovvero: con la semantica del movimento è possibile restituire semplicemente la copia pesante ma valori poco costosi (mentre in C ++ 98/03 la linea guida generale era di usare i parametri di output tramite riferimenti o puntatori non const), ad esempio:
// C++11 style
vector<string> MakeAVeryBigStringList();
// C++98/03 style
void MakeAVeryBigStringList(vector<string>& result);
D'altra parte, mi sembra che si debba lavorare di più sul passaggio dei parametri di input, in particolare quando è necessaria una copia di un parametro di input , ad es. in costruttori e setter.
La mia comprensione è che la tecnica migliore in questo caso è utilizzare modelli e std::forward<>
, ad es. (seguendo lo schema di questa risposta su C ++ 11 passaggio parametri ottimale ):
class Person
{
std::string m_name;
public:
template <class T,
class = typename std::enable_if
<
std::is_constructible<std::string, T>::value
>::type>
explicit Person(T&& name)
: m_name(std::forward<T>(name))
{
}
...
};
Un codice simile potrebbe essere scritto per setter.
Francamente, questo codice sembra standardplice e complesso e non si adatta bene quando ci sono più parametri (ad es. se un attributo cognome viene aggiunto alla classe sopra).
Sarebbe possibile aggiungere una nuova funzionalità a C ++ 11 al codice semplificare come questo (proprio come lambdas semplificare il codice C ++ 98/03 con i funtori in diversi casi)?
Stavo pensando ad una sintassi con qualche carattere speciale, come @
(poiché l'introduzione di una &&&
in aggiunta a &&
sarebbe una digitazione eccessiva :)
per esempio:.
class Person
{
std::string m_name;
public:
/*
Simplified syntax to produce boilerplate code like this:
template <class T,
class = typename std::enable_if
<
std::is_constructible<std::string, T>::value
>::type>
*/
explicit Person(std::string@ name)
: m_name(name) // implicit std::forward as well
{
}
...
};
Ciò sarebbe molto conveniente anche per i casi più complessi che coinvolgono più parametri, ad es.
Person(std::string@ name, std::string@ surname)
: m_name(name),
m_surname(surname)
{
}
Sarebbe possibile aggiungere una sintassi comoda semplificata come questa in C ++? Quali sarebbero gli aspetti negativi di una tale sintassi?