import std;
template staticCartesianProduct(Args...){
template With(Fs...){
alias With=AliasSeq!();
static foreach(F;Fs){
With=AliasSeq!(With,F!Args);
}}}
enum string foo(T...)="foo!"~T.stringof;
enum string bar(T...)="bar!"~T.stringof;
unittest{
assert([staticCartesianProduct!(int,float).With!(foo,bar)]==["foo!(int, float)","bar!(int, float)"]);
}