【发布时间】:2013-06-03 07:48:00
【问题描述】:
这个问题已经讨论过几次,但我发现的所有解决方案要么不起作用,要么基于 boost 的静态断言。我的问题很简单。我有一堂课,我只想允许真正的类型(双精度和浮点数)。如果我尝试使用浮点或双精度以外的类型实例化类,我想要一个编译时错误。我正在使用 Visual C++ 11。这是我尝试过的:
template <typename RealType>
class A
{
// Warning C4346
static_assert(std::is_same<RealType, double>::value || std::is_same<RealType, float>::value);
}
template <typename RealType>
class A
{
// Error C2062: type 'unknown' unexpected
static_assert(decltype(RealType) == double || decltype(RealType) == float);
}
有什么想法吗?提前致谢!
【问题讨论】:
-
第一个问题是,有关系吗?如果您使用另一种类型实例化模板,并且无法按照模板期望的方式处理该类型,则编译将失败。如果可以的话,only 允许这两种类型实际上是非法的......比如说......像 BigDecimal 这样的类型。
-
Visual Studio 真的在 static_assert 失败时发出警告,而不是错误?听起来像一个错误。
-
另见C++ templates that accept only certain types 和Restrict C++ Template Parameter to Subclass。它们早于 C++11,但它们可能会成为其他人的一个很好的标记。
-
相关,包括更详尽的 C++ 示例(在问题中),说明如何完全按照您在这个问题中提出的要求:How to use static assert in C to check the types of parameters passed to a macro
标签: c++ templates visual-studio-2012 c++11 static-assert