【发布时间】:2013-07-14 19:04:35
【问题描述】:
我正在尝试了解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();
}
};
Foo 仅在 Helper 的特化支持 T 的大小时才受支持。例如,Foo<long> 和 Foo<unsigned long> 都受支持。然而,假设用户试图构造一个Foo<bool>。通常,这会产生错误,因为未定义 bool 的 Helper 特化,这是预期的行为。
有没有什么方法可以在这个设计中使用static_assert来为这个界面的用户提供更多有用的错误?
此外,我还想限制用户使用特定类型,即使大小可能是正确的。例如,不应允许 Foo<float>。现在,我知道执行此操作的唯一方法是通过文档中的粗体注释。 :)
【问题讨论】:
-
更笼统地思考一下,它只是支持整数类型吗?没有
char、bool、float等? -
在 SO 中搜索模板类型约束或“概念”。在最后一刻从 C++11 中删除了执行此操作的工具。不过,实现类似结果的自动化方法较少。
-
@Rapptz、
char、int和long以及它们的unsigned版本应受支持。如果sizeof(int) == sizeof(long) == sizeof(unsigned long),int、long和unsigned long的代码将相同。
标签: c++ templates template-specialization static-assert