我有这个代码:
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 个字符作为该类的模板参数。编译时我该怎么办?
我可以使用 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 个参数时,模板用户收到的错误消息可能会令人困惑。本例中的断言有助于给出更好的错误消息。
关于c++ - 如何在编译时检查数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47753302/