Я не думаю, что кто-то четко понимает ваше требование, но это мое лучшее предположение при его рассмотрении ... иллюстрирующее, как обрабатывать то, что вы называете "цепочкой зависимостей" в шаблонном решении.Если это не помогает, но имеет какое-то отношение, объясните это, и проблемы помогут людям помочь вам.Если вы хотите применить алгоритмические циклы к объектам Foo<>
, я могу проиллюстрировать, как это сделать ....
#include <iostream>
struct Abstract_Bar
{
virtual void f() const = 0;
};
struct Bar1 : Abstract_Bar
{
void f() const { std::cout << "Bar1\n"; }
};
struct Bar2 : Abstract_Bar
{
void f() const { std::cout << "Bar2\n"; }
};
template <int N>
struct Foo
{
typedef Foo<N - 1> Lower;
typedef Foo<N + 1> Higher;
void f() const { std::cout << "Foo<N>\n"; }
Higher* higher_;
};
template <>
struct Foo<1>
{
typedef Foo<2> Higher;
void f() const { std::cout << "Foo<1>\n"; }
Higher* higher_;
};
template <>
struct Foo<4>
{
typedef Foo<3> Lower;
typedef Abstract_Bar Higher;
void f() const { std::cout << "Foo<4>\n"; }
Higher* higher_;
};
int main()
{
Foo<1> foo1;
Foo<2> foo2;
Foo<3> foo3;
Foo<4> foo4;
foo1.higher_ = &foo2;
foo2.higher_ = &foo3;
foo3.higher_ = &foo4;
Bar1 bar1;
foo4.higher_ = &bar1;
foo1.f();
foo2.f();
foo3.f();
foo4.f();
foo1.higher_->f();
foo2.higher_->f();
foo3.higher_->f();
foo4.higher_->f();
// switch to another type of "Bar"...
Bar2 bar2;
foo4.higher_ = &bar2;
foo4.higher_->f();
}