我试图了解 的用处static_assert
,我想知道它是否可以帮助我执行设计,如果可以,如何。
我有一个通用模板类,它将自己的实现隐藏在另一个模板类中,该模板类根据模板类型的大小部分专门化。以下是此设计的简要概述:
template <class T, size_t S = sizeof(T)>
struct Helper;
template <class T>
struct Helper<T, sizeof(long)>
{
static T bar();
};
// ... other specializations ...
template <class T>
class Foo
{
public:
T bar()
{
return Helper<T>::bar();
}
};
仅当HelperT
的专门化支持 size of 时才支持Foo。例如,和都受支持。但是,假设用户尝试构建一个. 通常,这会产生错误,因为未定义Helper for的专业化,这是预期的行为。Foo<long>
Foo<unsigned long>
Foo<bool>
bool
有没有什么方法可以static_assert
在这个设计中使用来为这个界面的用户提供更多有用的错误?
此外,我还想限制用户使用特定类型,即使大小可能是正确的。例如,Foo<float>
不应该被允许。现在,我知道执行此操作的唯一方法是通过文档中的粗体注释。:)