我想了解static_assert
的用处,并且我想知道它是否可以帮助我强制执行设计,如果是这样,如何实现。通过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();
}
};
富如果T
大小由助手的专业化支持,才支持。例如,Foo<long>
和Foo<unsigned long>
都支持。但是,假设用户试图构建一个Foo<bool>
。通常,这会产生错误,因为助手对于bool
没有定义,这是预期的行为。
在这个设计中有没有什么办法可以使用static_assert
为这个接口的用户提供更多有用的错误?
此外,我想也限制用户使用特定类型,即使尺寸可能是正确的。例如,不应允许使用Foo<float>
。现在,我知道强制执行此操作的唯一方法是通过文档中的大胆评论。 :)
更一般地想一想,它只是支持整数类型?没有'char','bool','float'等等? – Rapptz
搜索模板类型约束或“概念”。在最后一刻从C++ 11中删除了这样做的工具。尽管如此,自动获取类似结果的方法却较少。 – luke
@Rapptz,'char','int'和'long'以及它们的'unsigned'版本应该被支持。如果sizeof(int)== sizeof(long)== sizeof(unsigned long)',那么代码对于int,long和unsigned long是相同的。 – Zeenobit