mercredi 6 décembre 2017

static_assert for printf format

I am trying to make compile time checks over the format of the printf. Here is the code.

#include <type_traits>
#include <iostream>

template <typename CHAR, typename ...ARGS>
constexpr size_t trace_cond(CHAR fmt, ARGS&&... args) {
   //always needs to pass
   return 1;
}

template <size_t N, typename ...ARGS>
constexpr size_t trace_cond(const char (&fmt)[N], ARGS&&... args) {
   //return parse(fmt) == args;
   return sizeof...(args) != 0;
}

#define TRACE(fmt, ...) { \
   static_assert(trace_cond(fmt, __VA_ARGS__), "Wrong ARGS"); \
   printf(fmt, ##__VA_ARGS__); \
}

int main(int argc, char* argv[]) {
  //working fine
  TRACE("%d %d\n", 2, 3);

  const char* format = "%d %d\n";
  //error
  TRACE(format, 2, 3);
}

So when the format is known at compile time I want to have a check(using static_assert) and if it is not known then the check should be not called or always to pass

Obs:

  • Currently the code is not compiling because const char *format is not declared constexpr
  • The main should not be change because TRACE macro is used in a large codebase but changes to TRACE are more than welcome

So my question is: Is there a way to skip static_assert or make it pass when fmt type is const char *

Aucun commentaire:

Enregistrer un commentaire