c++ - call member function of a vector of templated class -
i have templated class (btw, use templated class because gives huge performance gain):
template<int n> class a;
my first issue wanted make vector of it. people suggest using boost::any, use void*.
a<1> a0; a<2> a1; vector<void*> v; v.push_back(&a0); v.push_back(&a1);
the problem comes when want call member function of element of vector:
for(auto : v) (a*)a->foo();
of course, not work, because don't provide template argument during converstion.... but, don't find way make works.
do have idea?
a<1> , a<2> completely separate classes.
consider: if have 2 classes x , y both have foo method:
class x {public: void foo() {std::cout << "x::foo" << std::endl;}}; class y {public: void foo() {std::cout << "y::foo" << std::endl;}}; and vector of void*'s, how can call foo method on of them?
vector<void*> v; v.push_back(new x); v.push_back(new y); for(auto : v) a->foo(); // how can this? the answer simple: you can't access member name this.
(what if made class z had foo method? you'd expect call if there z in vector; member names removed when code compiled, wouldn't know member called foo!)
however, create base class , make method virtual:
class xybase { public: virtual void foo() = 0; } class x : public xybase {public: void foo() {std::cout << "x::foo" << std::endl;}}; class y : public xybase {public: void foo() {std::cout << "y::foo" << std::endl;}}; and can have vector<xybase*>:
vector<xybase*> v; v.push_back(new x); v.push_back(new y); for(auto : v) a->foo(); // works! the template equivalent be:
class xbase { public: virtual void foo() = 0; } template<int n> class x : public xbase { public: void foo() { std::cout << "x<" << n << ">::foo" << std::endl; } }; // ... later ... vector<xbase*> v; v.push_back(new x<1>); v.push_back(new x<2>); for(auto : v) a->foo(); // works!
Comments
Post a Comment