• Как правильно писать и запускать тесты и микробэнчмарки в отдельных файлах(Google test/Google benchmark) в с++?

    @Bladegreat
    Обычно такие вещи выносятся в отдельные цели сборки. То есть у тебя будут следующие таргеты: основное приложение, тесты, бенчмарки. В проектах собираемых cmake, тесты регистрируются через add_test и IDE из подхватывает и позволяет запускать прям из своего интерфейса, а в CI они запускаются через ctest. То есть нужно правильно разделить приложение и собрать три (или больше) отдельных исполняемых файла.
  • Как избавится от шаблона?

    @Bladegreat
    Проблему общего класса можно решить добавлением еще одного уровня абстрации.

    class BaseIO {
    public:  
      ...
    };
    
    tamplate <class TClass>
    class InitIO : public BaseIO
    {
      static void AlternateInit(AlternateParameters val) {
        TClass io = { val.port, val.pin };
        io.SetAlternate(val.alternate);
        return io.SetParameters({ Mode::Alternate });
      }
    
      static void AnalogInit(AnalogParameters val) {
        TClass io = { val.port, val.pin };
        return io.SetParameters({ Mode::Analog, val.pull });
      }
    }
    
    class IOPort : public InitIO<IOPort> {
    };
    
    IOPort::AlternateInit({ .... });
    vs
    AlternateInit<IOPort>({ .... });


    Думаю также можно просто переопределить функцию в производном классе.

    class IOPort : public BaseIO 
    {
    public:
        static void AnalogInit(AlternateParameters val)
        {
            BaseIO::AnalogInit<IOPort>(val);
        }
    }; 
    
    IOPort::AnalogInit(...);