提问人:Nelsen Edbert Winata 提问时间:1/6/2023 最后编辑:Ted LyngmoNelsen Edbert Winata 更新时间:1/6/2023 访问量:381
如何将模板类型(std::array 或 std::vector)传递给模板参数
How to pass a template type (std::array or std::vector) to a template parameter
问:
我有一个函数模板,其中函数的返回类型是模板参数。根据 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 字节的数据类型。From
uint8_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
答:
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);
但这很好,因为您不能部分专用化函数模板。在这里,你有过载。
评论