Ho letto molti post su modelli variadic e std :: bind ma penso di non capire ancora come lavorano insieme. Penso che i miei concetti siano un po 'confusi quando si tratta di usare modelli variadici, per quale std :: bind viene usato e come si legano tutti insieme.Un po 'confuso riguardo a std :: ref() e std :: bind() con modelli variadici
Nel seguente codice my lambda utilizza l'operatore punto con oggetti di tipo TestClass ma anche quando passo in oggetti di tipo std :: ref funzionano ancora. Come è esattamente? Come avviene la conversione implicita?
#include <iostream>
using std::cout;
using std::endl;
#include <functional>
#include <utility>
using std::forward;
class TestClass {
public:
TestClass(const TestClass& other) {
this->integer = other.integer;
cout << "Copy constructed" << endl;
}
TestClass() : integer(0) {
cout << "Default constructed" << endl;
}
TestClass(TestClass&& other) {
cout << "Move constructed" << endl;
this->integer = other.integer;
}
int integer;
};
template <typename FunctionType, typename ...Args>
void my_function(FunctionType function, Args&&... args) {
cout << "in function" << endl;
auto bound_function = std::bind(function, args...);
bound_function();
}
int main() {
auto my_lambda = [](const auto& one, const auto& two) {
cout << one.integer << two.integer << endl;
};
TestClass test1;
TestClass test2;
my_function(my_lambda, std::ref(test1), std::ref(test2));
return 0;
}
Più specificamente, passo a due istanze di un reference_wrapper con i due oggetti TestClass
test1
e test2
, ma quando li passo al lambda all'operatore .
funziona magicamente. Mi aspetterei che avete utilizzare la funzione ::get()
nella reference_wrapper per fare questo lavoro, ma la chiamata al membro di dati .integer
funziona ..
* "Come avviene la conversione implicita?" * - conversione implicita tra quali tipi? – soon
aggiornerò la mia domanda per essere più chiara. Mi dispiace per quello – Curious
@soon There! Questo rende la mia domanda più chiara? – Curious