Нет, вы не можете переключать аргументы шаблона во время выполнения, так как шаблоны создаются экземпляром компилятора во время компиляции. То, что вы можете сделать, это иметь оба шаблона, производные от общего базового класса, всегда использовать базовый класс в вашем коде и затем решать, какой производный класс использовать во время выполнения:
class Base
{
...
};
template <typename T>
class Foo : public Base
{
...
};
Base *newBase()
{
if(some condition)
return new Foo<float>();
else
return new Foo<double>();
}
Макросы имеют ту же проблему, что и шаблоны, в том, что они раскрываются во время компиляции.