简体   繁体   中英

How to pass a template type (std::array or std::vector) to a template parameter

I have a function template where the return type of the function is the template argument. According to https://en.cppreference.com/w/cpp/language/template_argument_deduction , we can have a template argument deduction with the following examples

template<typename To, typename From>
To convert(From f);

Now as an example, I want to make a specialized function for this where I passed the following:

auto x = convert<std::array>(6000); // the From should be deduced as int.

In this case, I want to make a specialized function template, where the sizeof the From determines the size of the array, and to keep it simple, assume that uint8_t is the type of the array as the data type which represents 1 byte.

Therefore, the type of x should be std::array<uint8_t, 4> .

Another example:

auto y = convert<std::array>(1.02322); // the From should be deduced as double

In this case, the type of y should be std::array<uint8_t, 8> .

The second problem is if std::vector is passed as a template argument

auto x = convert<std::vector>(6000); // the From should be deduced as int

The type of x should be std::vector<uint8_t> , and the length of the vector is 4

How to make such function template that can accept both std::array and std::vector, and without using any std::span algorithm as I am limited to c++11/14

std::array and std::vector are different kinds of template.

To match std::vector , you can have

template <template <typename...> class To, typename From>
To<uint8_t> convert(From from);

To match std::array , you need

template <template <typename, std::size_t> class To, typename From>
To<uint8_t, sizeof(From)> convert(From from);

But this is good, because you can't partially specialise a function template. Here you instead have overloads.

See it on coliru

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM