gpt4 book ai didi

c++ - 如何将模板类限制为某些内置类型?

转载 作者:IT老高 更新时间:2023-10-28 12:59:09 35 4
gpt4 key购买 nike

这个问题已经讨论过几次,但我发现的所有解决方案要么不起作用,要么基于 boost 的静态断言。我的问题很简单。我有一个类,我只想允许真正的类型( double 和 float )。如果我尝试使用浮点或 double 以外的类型实例化类,我想要一个编译时错误。我正在使用 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);
}

有什么想法吗?提前致谢!

最佳答案

在您的第一个示例中,static_assert 应采用第二个参数,该参数将是字符串文字,否则将被视为失败(edit: 删除第二个参数是合法的从 C++17 开始)。而且这第二个参数不能默认。

您的第二个示例不正确有几个原因:

  • decltype 用于表达式,而不是类型。
  • 您根本无法使用 == 比较类型,正确的做法是您在第一次尝试时尝试使用 std::is_same

所以,做你想要达到的目标的正确方法是:

#include <type_traits>

template <typename RealType>
class A
{
static_assert(std::is_same<RealType, double>::value || std::is_same<RealType, float>::value,
"some meaningful error message");
};

此外,我敢打赌,您正试图将您的模板限制为浮点值。为此,您可以使用特征 std::is_floating_point :

#include <type_traits>

template <typename RealType>
class A
{
static_assert(std::is_floating_point<RealType>::value,
"class A can only be instantiated with floating point types");
};

作为奖励,请使用 this online example .

关于c++ - 如何将模板类限制为某些内置类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16976720/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com