I have:
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
auto a = -SOME_CONST_MAX;
vector<auto> myVec {a, a, a, a};
}
I don't know the type of the SOME_CONST_MAX
but I want to make a vector of the type of -SOME_CONST_MAX
. I assumed vector<auto>
would work as it will deduce from type of a
.
I'm getting these errors running:
g++ -std=c++14 main.cpp
main.cpp:9:9: error: invalid use of ‘auto’
vector<auto> myVec {a, a, a, a};
^
main.cpp:9:13: error: template argument 1 is invalid
vector<auto> myVec {a, a, a, a};
^
main.cpp:9:13: error: template argument 2 is invalid
main.cpp:9:32: error: scalar object ‘myVec’ requires one element in initializer
vector<auto> myVec {a, a, a, a};
^
Is vector<auto>
not allowed? What am I doing wrong?
I find Slava's solution really simple and elegant
vector<decltype(a)> myVec {a, a, a, a};
But just to show another way, you can use the variadic
template function
template <typename T, typename ... Ts>
std::vector<T> getVect (T const & t, Ts const & ... ts)
{ return { t, ts... } ; }
You can use auto
again
auto myVec = getVect(a, a, a, a, a);
If I remember correctly, proposals have been made for vector<auto>
syntax. They where not accepted by the C++ standard committee.
C++17 will introduce something like std::vector bob = {a,a,a,a};
that just works. Note the lack of <auto>
. This may just be the language feature, with actual use in std
following afterward.
auto
is also added to templates, but auto
is always a value never a type. So using auto
to replace a type was considered a bad idea.
Here is a use of auto
in a template:
template<auto x>
using constant_t=std::integral_constant<decltype(x),x>;
template<auto x>
constexpr constant_t<x> constant{};
and now constant<7>
is a std::integral_constant<int,7>
. This is considered useful for many reasons.
The answer to your practical problem using current C++ is:
auto a = -SOME_CONST_MAX;
std::vector<decltype(a)> myVec {a, a, a, a};
where we deduce the type of a
and pass it to vector
.
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