In your first example, static_assert
should take a second parameter which would be a string literal, otherwise it's deemed to fail (edit: dropping the the second parameter is legal since C++17). And this second argument cannot be defaulted.
Your second example is incorrect for several reasons:
decltype
is meant to be used on an expression, not on a type.
- You simply cannot compare types with
==
, the correct way to do this is what you try in your first attempt with std::is_same
.
So, the right way to do what you are trying to achieve is:
#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");
};
Moreover, I bet you are trying to constrict your template to floating points values. In order to do this, you can use the trait 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");
};
And as a bonus, take this online example.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…