How to do FloatVectorOperations on all channels in a buffer?

That’s a great way to achieve better code structure for the different modes, however as the mode of choice needs to be dertermined at runtime, the overall processing function would still need something like

renderNextBlock (AudioBuffer<float>& outputBuffer, int startSample, int numSamples)
{
    // Assuming these parameters are fixed for each sample block, query them once at the start 
    // of the rendering process for this block. This could be e.g. int plugin parameters referring
    // to some enum constants...
    const auto processingStep1Mode = getProcessingStep1Mode();
    const auto processingStep2Mode = getProcessingStep2Mode();
    const auto processingStep3Mode = getProcessingStep3Mode();

    auto* ptr = // compute the pointer to the memory you have to write to

    switch (processingStep1Mode)
    {
        case Step1Modes::mode0: Processor<Step1Mode0Implementation>::process (ptr, numSamples); break;
        case Step1Modes::mode1: Processor<Step1Mode1Implementation>::process (ptr, numSamples); break;
        case Step1Modes::mode2: Processor<Step1Mode2Implementation>::process (ptr, numSamples); break;

        // ... and so on
    }

    switch (processingStep2Mode)
    {
        case Step2Modes::mode0: Processor<Step2Mode0Implementation>::process (ptr, numSamples); break;
        case Step2Modes::mode1: Processor<Step2Mode1Implementation>::process (ptr, numSamples); break;
        case Step2Modes::mode2: Processor<Step2Mode2Implementation>::process (ptr, numSamples); break;

        // ... and so on
    }

    // ... the same for the third step
}