我有这段代码:
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吗?
答案 0 :(得分:2)
不确定
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个参数时获得的错误消息可能会令人困惑。在这种情况下的断言有助于提供更好的错误消息。