2

I have this code:

template<char... Ts>
class  myIDClass 
{
protected:
       std::vector<uint8_t> m_ID = { Ts... };

public:
       std::vector<uint8_t> getID()
        {
             return m_ID;
        }
}

and I can use it in this way:

class   MyClass: myIDClass<'1','2','3','4','5','6','7','8'>
{
  // some code here
}

MyClass mc;

But I want to make sure that the person that uses myIDClass enter exactly 8 character to enter as template parameter to the class. How can I do during compilation?

Is there anyway that I can do this using of static_asset?

mans
  • 15,766
  • 39
  • 153
  • 296

1 Answers1

2

Sure:

template<char... Ts>
class myIDClass
{
    static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments");

    // ...

However, since you know at compile time that you want exactly 8 values, you can use std::array instead:

#include <array>
// ...

template<char... Ts>
class  myIDClass 
{
    // The assertion is not actually needed, but you might still want to keep
    // it so that the user of the template gets a better error message.
    static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments");

protected:
    std::array<uint8_t, 8> m_ID = { Ts... };

public:
    std::array<uint8_t, 8> getID()
    {
        return m_ID;
    }
};

In this case, you don't need the static_assert anymore. However, the error message the user of the template gets when not using exactly 8 arguments can be confusing. The assertion in this case helps with giving out a better error message.

Nikos C.
  • 49,123
  • 9
  • 66
  • 95