1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
struct A { virtual void foo() { std::cout << 0; } virtual ~A() {} };
struct B : A { void foo() { std::cout << 1; } };
template<typename, typename, typename, typename...>
struct CallFunction;
template<typename Obj, typename R, typename ...Args>
struct CallFunction<R(Obj::*)(Args...),Obj,R,Args...>
{
static R Call(R(Obj::*Function)(Args...), Obj& Object, Args...Arguments)
{ return (Object.*Function)(Arguments...); }
};
template<typename, typename, template<typename, typename> class>
struct Sorted;
template<typename Object, typename Sort,template<typename, typename>class Storing>
class Sorted<Object*, Sort, Storing>
{
private :
Storing<std::pair<Object*, Sort>, std::allocator<std::pair<Object*, Sort>>> List;
public :
void AddElement(Object* Element, Sort Position)
{
auto it=List.begin();
for(; it != List.end(); ++it) if(it->second <= Position) break;
List.insert(it,std::make_pair(Element,Position));
}
template<typename Fc> void ForEach(Fc Function)
{
for(auto it = List.begin(); it != List.end(); ++it)
CallFunction<Fc, Object, void>::Call(Function, *(it->first));
}
};
int main()
{
Sorted<A*, size_t, std::vector> s;
s.AddElement(new A(), 0); s.AddElement(new B(), 1);
s.ForEach(&A::foo);
system("PAUSE"); return 0;
} |
Partager