I have been using tag dispatching to model a problem.
Note : This code runs, I am simply interested in a solution that doesn't involve so much coding, only to reverse the arguments of a dispatched algorithm.
Here is the code in question:
#include <iostream>
struct A_tag {};
struct B_tag {};
// Tag getter
template<typename Type>
struct get { typedef void tag; };
namespace dispatch {
template<typename T1, typename T2>
struct my_algorithm {};
template<>
struct my_algorithm<A_tag, B_tag>
{
template<typename P1, typename P2>
static void apply(P1 const& p1, P2 const& p2)
{
auto p1val = p1.value();
auto p2val = p2.someFunction();
std::cout << p1val << " " << p2val << std::endl;
}
};
//Specialization reversal: can this be made shorter?
//A lot of lines used just to reverse the algorithm.
template<>
struct my_algorithm<B_tag, A_tag>
{
template<typename P2, typename P1>
static void apply(P2 const & p2, P1 const & p1)
{
my_algorithm<typename get<P1>::tag, typename get<P2>::tag>::apply(p1, p2);
}
};
}
// First and Second are test classes.
class First
{
public:
double value() const { return 5; };
};
template<>
struct get<First>
{
typedef A_tag tag; // Expect First to behave as A
};
class Second
{
public:
double someFunction() const { return 6; };
};
template<>
struct get<Second>
{
typedef B_tag tag; // Expect Second behave as B
};
// Tag dispatcher.
template<typename P1, typename P2>
void my_algorithm(P1 const & p1, P2 const & p2)
{
dispatch::my_algorithm<typename get<P1>::tag, typename get<P2>::tag>::apply(p1, p2);
}
int main(int argc, const char *argv[])
{
First f;
Second s;
my_algorithm(f, s);
// Commutative algorithm.
my_algorithm(s,f);
return 0;
}
Some dispatched algorithms work the same irrespective of the order of template parameters. The dispatch::my_algorithm::apply
functions do all the work in this example. I have managed to reverse the template parameters using full template specialization for the dispatch::my_algorithm class and calling the static apply
function with reversed arguments.
Can the argument reversal be done more quickly? Even if I somehow manage to pack it and "call it" , what happens for other algorithms when apply
takes on more arguments?