[在类中使用static_assert-如何?

问题描述 投票:1回答:1

我试图简化在编译时检查将一个值转换为新类型是否保留该值的过程。 STL中可能有一些可以帮我实现的功能,但是我看不到,所以我写了一个。它可以工作,但我想将其转换为类,以使其他人的使用更加简单。我无法使它正常工作,感觉好像我缺少明显的东西。

这很好用:

    template <typename T, typename Q>
    constexpr bool checkV(const Q x) 
    {return x == (T)x && ((x < 0) == ((T)x < 0));}

    static_assert(checkV<unsigned int>(-7), "No");

但是通话很麻烦,所以我想要更多类似的东西

    CheckIt<unsigned int>(-7)

所以我尝试了

    template<typename T>
    class CheckIt {public:
      template<typename Q>
      constexpr CheckIt(const Q x) {static_assert(checkV<T>(x), "No");}
};

我尝试了const和constexpr的各种组合(发现的参数不能是constexprs,这很烦人)。我尝试的所有操作都会导致g ++抱怨x在构造函数中不是常量表达式。

我想念的是什么? checkv和构造函数都总是使用常量来调用,例如-7。 checkv()很高兴在编译时进行评估,我看不出在哪里使用构造函数进行包装,这会给编译器增加任何额外的负担,但显然可以。请注意,我需要在C ++ 11中使用它,但是我看不到更高版本的帮助。我在使用assert在运行时检查时没有问题,但是我想要常量的编译时解决方案。 TIA。

c++ static-assert
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.