如何将模板类型(std::array 或 std::vector)传递给模板参数

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

提问人:Nelsen Edbert Winata 提问时间:1/6/2023 最后编辑:Ted LyngmoNelsen Edbert Winata 更新时间:1/6/2023 访问量:381

问:

我有一个函数模板,其中函数的返回类型是模板参数。根据 https://en.cppreference.com/w/cpp/language/template_argument_deduction,我们可以通过以下示例进行模板参数推导

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

现在举个例子,我想为此创建一个专门的函数,我传递了以下内容:

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

在这种情况下,我想制作一个专门的函数模板,其中 sizeof 决定了数组的大小,为了简单起见,假设它是数组的类型作为表示 1 字节的数据类型。Fromuint8_t

因此,x 的类型应为 。std::array<uint8_t, 4>

另一个例子:

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

在这种情况下,y 的类型应为 。std::array<uint8_t, 8>

第二个问题是 if 作为模板参数传递std::vector

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

x 的类型应为 ,向量的长度为 4std::vector<uint8_t>

如何制作这样的函数模板,可以同时接受 std::array 和 std::vector,并且不使用任何 std::span 算法,因为我仅限于 c++11/14

C++ 模板 STL C++14

评论


答:

3赞 Caleth 1/6/2023 #1

std::array并且是不同类型的模板。std::vector

为了匹配,你可以有std::vector

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

要匹配,您需要std::array

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

但这很好,因为您不能部分专用化函数模板。在这里,你有过载。

在 coliru 上看到它