Je veux remplacer ces macros avec un modèle variadique qui réalise la même chose.Comment créer une fonction de modèle variadique pour déplacer les valeurs d'argument et gérer à la fois les valeurs lvalues et les valeurs rvalues?
#define SHFT2(a, b, c) do { (a) = (b); (b) = (c); } while(0)
#define SHFT3(a, b, c, d) do { (a) = (b); (b) = (c); (c) = (d); } while(0)
#define SHFT4(a, b, c, d, e) do { (a) = (b); (b) = (c); (c) = (d); (d) = (e); } while(0)
J'ai une solution qui fonctionne pour lvalues
template<typename T, typename... Ts>
T first(T t, Ts... ts)
{
return t;
}
template<typename T>
void shift(T t)
{
// do nothing
}
template<typename T, typename... Ts>
void shift(T& t, Ts&... ts)
{
t = first(ts...);
shift(ts...);
}
Par exemple, cela fonctionne
int w = 1;
int x = 2;
int y = 3;
int z = 4;
shift(w, x, y, z);
printf("%d %d %d %d\n", w, x, y, z); // 2 3 4 4
Mais je veux être en mesure de passer dans un rvalue à la fin
shift(w, x, y, z, 5);
printf("%d %d %d %d\n", w, x, y, z); // expect 2 3 4 5
J'ai l'erreur
test.cpp:31:2: error: no matching function for call to 'shift'
shift(w, x, y, z, 5);
^~~~~
test.cpp:16:6: note: candidate function [with T = int, Ts = <int, int, int, int>] not viable: expects an l-value for 5th
argument
void shift(T& t, Ts&... ts)
^
test.cpp:10:6: note: candidate function template not viable: requires single argument 't', but 5 arguments were provided
void shift(T t)
car vous ne pouvez pas référencer un rvalue.
Comment puis-je faire cela fonctionner dans les deux cas?
Qu'en est-il de la macro que vous avez mentionnée? Je suppose que cela produira le même genre d'erreur. Affecter quelque chose à un littéral comme 5 de toute façon n'a pas de sens. Ou, avez-vous l'intention de mettre une valeur seulement à la dernière position? –
@JunekeyJeon Correct. Il n'y aura jamais qu'une valeur à la dernière position. – strobot