I have a template class like this:
template<int dimension>
class Foo{
Foo(std::array<double, dimension>);
}
and a function
func(Foo<1> f);
I would like to be able to call the function and the constructor like this:
func(1);
Foo<1> f(1);
instead of
func({1});
Foo<1> f({1});
Is there a nice way to achieve this?
If implicit conversion is not possible, can 1 add a constructor for the Foo<1> case only?
An implicit conversion for a double into a std::array<double, 1> is not possible. That would require overloading a conversion operator for double but that can't be done as you can't overload operators for built in types.
What you can do is add
Foo(double);
constructor and then use a static_assert like
static_assert(dimension == 1, "single double constructor only works if dimension == 1");
in the body of the constructor to limit it to only work when the array has a size of 1. (I like using static_assert when I can because it lets you write a nice, descriptive, error message)
You should consider renaming dimension to size since that is what is specifying in the array.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With