Home > database >  Cast to `constexpr`
Cast to `constexpr`

Time:10-21

Lets say I have:

(please ignore the fact that I am using strncmp in C )

if (!strncmp(some_str, "constant", strlen("constant"))) {}

The strlen can be evaluated at compile time but it can't be eliminated because the function is not constexpr.

One way around would be (accepted only by g ):

constexpr size_t len = strlen("constant");
if (!strncmp(some_str, "constant", len)) {}

but this is harder to read and less practical.

Is there any way to specify constexpr for a part of a statement?

CodePudding user response:

This is fundamentally impossible. Compilers can delay evaluation - do constexpr calculations later, at runtime. But they can't travel back in time. If even a single (evaluated) subexpression is not constexpr, then the whole expression cannot be constexpr.

CodePudding user response:

You have to be in specific case to force constexpr evaluation, std::integral_constant might help:

if (!strncmp(some_str,
             "constant",
             std::integral_constant<std::size_t, strlen("constant")>()))
{
// ...
}

alias/MACRO might shorten std::integral_constant<std::size_t, strlen("constant")>()

Not sure it is better than your:

constexpr size_t len = strlen("constant");
if (!strncmp(some_str, "constant", len))
{
    // ...
}

Note: I assume that strlen is your own constexpr version (as standard one is not constexpr).

  •  Tags:  
  • c
  • Related