Здравствуйте, <Аноним>, Вы писали:
А>Возможно ли с помощью шаблонной магии сделать аналогичный результат вывода main() без перечисления всех возможных сочетаний типов из списков?(Т.е что то типа одного вызова f(List2,List1) ) Использование локи не обязательно-просто для примера.
Да, смотри boost/mpl.
Я не шибко разбираюсь в том, как писать навороченные формулы там, поэтому вместо того, чтобы сделать декартово произведение и пробежаться по нему, устроил двойной цикл на велосипеде
#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/transform.hpp>
#include <iostream>
namespace bm = boost::mpl;
// коллекции типов
typedef bm::vector<char,int,double> va;
typedef bm::vector<short,float> vb;
// целевая функция
template<class A, class B> void f() { std::cout << __FUNCSIG__ << std::endl; }
// обёртка типа (мало ли, вдруг он не DefaultConstructible окажется...)
template<class T> struct wrap { typedef wrap type; }; //TODO: bm::quote, bm::identity...
// обёртываем наши коллекции перед итерированием
typedef bm::transform< va, wrap<bm::_1> >::type wa; // bm::vector< wrap<char>, wrap<int>, wrap<double> >
typedef bm::transform< vb, wrap<bm::_1> >::type wb;
// для данного элемента первой коллекции...
template<class A> struct fab
{
// и данного элемента второй коллекции...
template<class B> void operator()(wrap<B>) const { f<A,B>(); } // вызываем целевую функцию
};
struct fa
{
// для данного элемента первой коллекции...
template<class A> void operator()(wrap<A>) const
{
bm::for_each<wb>(fab<A>()); // устраиваем забег по второй
}
};
int main()
{
bm::for_each<wa>(fa()); // устраиваем забег по первой коллекции
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>