Om jag inte minns helt fel så ska du inte ha & före foo, dvs du ska ha
B<void (*)(int),int> b1(foo,1);
B<void (*)(int,int),int,int> b2(bar,2,2);
Jag är inte säker, men du kan ju testa.
2 svar · 258 visningar · startad av MCW
Följande kompilerar fint. Men jag kan inte ta bort kommenteringen i do_action. Då klagar den på att function() vill ha ett annat antal argument (foo och bar är olika!). På vilket sätt kan jag lösa detta? Det viktigaste är att koden i main() är ser ut så här.
# include <iostream>
class A
{
public:
virtual ~A() {};
virtual bool do_action() = 0;
};
template<class F, class T1, class T2 = int>
class B : public A
{
public:
B(F fcn, T1 arg1)
: function(fcn), argument1(arg1) {};
B(F fcn, T1 arg1, T2 arg2)
: function(fcn), argument1(arg1), argument2(arg2) {};
~B() {};
bool do_action() {
//function(argument1);
//function(argument1,argument2);
return true;
}
F function;
T1 argument1;
T2 argument2;
};
void foo(int i) {
std::cout << "foo(" << i << ")\n";
}
void bar(int i, int j) {
std::cout << "bar(" << i << "," << j << ")\n";
}
int main() {
B<void (*)(int),int> b1(&foo,1);
b1.do_action();
B<void (*)(int,int),int,int> b2(&bar,2,2);
b2.do_action();
return 0;
}
Om jag inte minns helt fel så ska du inte ha & före foo, dvs du ska ha
B<void (*)(int),int> b1(foo,1);
B<void (*)(int,int),int,int> b2(bar,2,2);
Jag är inte säker, men du kan ju testa.
Det går det också, men det löser inte mitt problem. Jag vill ha något liknande med detta (fast det kompilerar inte). Taget från klassdefinitionen av B.
B(F fcn, T1 arg1)
: function(fcn), argument1(arg1), n(1) {};
B(F fcn, T1 arg1, T2 arg2)
: function(fcn), argument1(arg1), argument2(arg2), n(2) {};
~B() {};
bool do_action() {
if (n==1) function(argument1);
if (n==2) function(argument1,argument2);
return true;
}