I have a template function:
template <typename T>
constexpr T Square(T t) {
return t * t;
}
This works fine when doing:
constexpr int four_square = Square(4);
Unfortunately I also have a user defined arithmetic type, MyInt
whose multiplication operator is not defined as constexpr
because it is not a single line and the code needs to compile in C++11 as well. So clearly the following won't work:
constexpr MyInt four_square = Square(MyInt(4));
But I want to be able to write:
const MyInt four_square = Square(MyInt(4)); // Note, const not constexpr.
This code doesn't compile because MyInt
doesn't support constexpr
even though I am not utilizing the constexpr
in my code.
Is there any way to write a template function that will return a constexpr for types that support constexpr, but will return a non-constexpr for types that don't.
What I want to avoid is duplicating the implementation of Square
, so if I could write:
template <typename T>
constexpr T ConstSquare(T t) {
return t * t;
}
template <typename T>
T Square(T t) {
return ConstSquare(t);
}
That would be fine but I can't because I can't call ConstSquare<MyInt>
.
Note The function Square
is not really what my function does, so whereas repeating t * t
doesn't sound so painful, in my case it is more annoying.
Aucun commentaire:
Enregistrer un commentaire