如何在编译时检查数组的大小
how to check the size of an array during compile time
我有这个代码:
template<char... Ts>
class myIDClass
{
protected:
std::vector<uint8_t> m_ID = { Ts... };
public:
std::vector<uint8_t> getID()
{
return m_ID;
}
}
我可以这样使用它:
class MyClass: myIDClass<'1','2','3','4','5','6','7','8'>
{
// some code here
}
MyClass mc;
但我想确保使用 myIDClass 的人准确输入 8 个字符作为模板参数输入 class。编译时怎么办?
我是否可以使用 static_asset 来做到这一点?
当然可以:
template<char... Ts>
class myIDClass
{
static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments");
// ...
但是,由于您在编译时就知道您需要 8 个值,因此可以使用 std::array
代替:
#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;
}
};
在这种情况下,您不再需要 static_assert
。但是,模板用户在未使用恰好 8 个参数时收到的错误消息可能会令人困惑。本例中的断言有助于发出更好的错误消息。
我有这个代码:
template<char... Ts>
class myIDClass
{
protected:
std::vector<uint8_t> m_ID = { Ts... };
public:
std::vector<uint8_t> getID()
{
return m_ID;
}
}
我可以这样使用它:
class MyClass: myIDClass<'1','2','3','4','5','6','7','8'>
{
// some code here
}
MyClass mc;
但我想确保使用 myIDClass 的人准确输入 8 个字符作为模板参数输入 class。编译时怎么办?
我是否可以使用 static_asset 来做到这一点?
当然可以:
template<char... Ts>
class myIDClass
{
static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments");
// ...
但是,由于您在编译时就知道您需要 8 个值,因此可以使用 std::array
代替:
#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;
}
};
在这种情况下,您不再需要 static_assert
。但是,模板用户在未使用恰好 8 个参数时收到的错误消息可能会令人困惑。本例中的断言有助于发出更好的错误消息。