Home > Enterprise >  C Constexpr Template Structs with String Literals
C Constexpr Template Structs with String Literals

Time:10-09

Currently using C 20, GCC 11.1.0.

I'm trying to create types in a namespace with a unique value and name. I came up with this structure specifically to be able to access the variables with the scope resolution operator like so: foo::bar::name. However, I have no idea how to initialize the name variable. I tried adding a second non-type parameter const char* barName, but it wouldn't let me use string literals as template arguments.

Code:

namespace foo
{
    template<uint32_t id>
    struct bar
    {
        static constexpr uint32_t value {id};
        static constexpr std::string_view name {};
    };

    using a = bar<0>;
    using b = bar<1>;
}

Error Code:

namespace foo
{
    template<uint32_t id, const char* barName>
    struct bar
    {
        static constexpr uint32_t value {id};
        static constexpr std::string_view name {barName};
    };

    using a = bar<0, "a">;
    using b = bar<1, "b">;
}

CodePudding user response:

Since we can't pass string literals as template arguments, we have to use some other way. In particular, we can have a static const char array variable as shown below:

static constexpr char ch1[] = "somestrnig";
static constexpr char ch2[] = "anotherstring";
namespace foo
{   //--------------------vvvvvvvvvvvvvvvv--->added this 2nd template parameter
    template<uint32_t id, const char* ptr>
    struct bar
    {
        static constexpr uint32_t value {id};
        //--------------------------------------vvvv-->added this
        static constexpr std::string_view name {ptr};
    };
    //---------------vvv----->added this
    using a = bar<0, ch1>;
    using b = bar<1, ch2>;
}
  • Related