如何解决简写 std::array 文字参数
我一直在尝试编写一些仍然使用 std::array 的较短代码,但我不确定如何使推导对我有利。
有没有办法把它写成和矢量版本一样短(可读)?
#include <array>
#include <iostream>
#include <vector>
template <std::size_t SIZE>
void afunc(const std::array<std::string_view,SIZE> &v)
{
for(int i=0; i<10; i++)
{
std::cout << v[rand()%SIZE];
}
}
void vfunc(const std::vector<std::string_view> &v)
{
for(int i=0; i<10; i++)
{
std::cout << v[rand()%v.size()];
}
}
using namespace std::string_view_literals;
int main()
{
std::array<std::string_view,2> works = {"1","2"};
afunc(works);// verbose
//afunc({ "1","2" }); // 1st fail
//afunc({ "1"sv,"2"sv }); // 2nd fail
//afunc(std::array{ "3","4" });// 3rd fail
afunc(std::array{ "3"sv,"4"sv,"test"sv,"other"sv });// works but verbose
vfunc({"5","6","7"});// vectors are easy to code with
return 0;
}
解决方法
std::array
和 std::vector
具有相同的 size()
和 operator[]
成员,因此您可以将 2 个函数合并为 1 个函数:
template <typename Container>
void func(const Container &c)
{
for(int i = 0; i < 10; ++i)
{
std::cout << c[rand() % c.size()];
}
}
std::array<std::string_view,2> a{"1","2"};
func(a);
std::vector<std::string_view> v{"1","2"};
func(v);
func<std::array<std::string_view,2>>({"1","2"});
func<std::vector<std::string_view>>({"1","2"});
但是,如您所见,这对于您的口味来说可能过于冗长。但是,通过定义一个接受 std::initializer_list
作为参数的额外函数,您可以支持花括号列表作为参数而不必显式指定模板参数,然后编译器可以推断出该参数给你。
但是,std::initializer_list
没有 operator[]
,因此如果您打算在函数之间共享公共代码,则必须更改主函数逻辑以使用随机访问迭代器,例如:
template <typename Iter>
void func(Iter begin,Iter end,std::random_access_iterator_tag)
{
size_t size = end - begin;
for(int i = 0; i < 10; ++i)
{
std::cout << *(begin + (std::rand() % size));
}
}
template <typename Iter>
void func(Iter begin,Iter end)
{
func(begin,end,typename std::iterator_traits<Iter>::iterator_category());
}
template <typename Container>
void func(const Container &c)
{
func(std::begin(c),std::end(c));
}
template <typename T>
void func(const std::initializer_list<T> &l)
{
func(l.begin(),l.end());
}
std::array<std::string_view,"2"};
func(v);
func({"1"sv,"2"sv});
,
您无法从初始化列表参数推断编译时大小,因此您需要显式传递大小:
template <std::size_t Size>
void afunc(const std::array<std::string_view,Size> &v)
{ ... }
int main()
{
afunc<2>({ "1","2" }); // ok
}
vfunc
的 std::vector
不需要推断编译时大小,这就是为什么此限制仅适用于 std::array
中 afunc
的模板参数推断.
发现了如何让 C 风格的数组作为一个选项工作。当我在我的引用不是 const 之前尝试过这个时,因此不会用临时编译。由于缺少迭代器,不如数组好,但仍然很简单
*String queryParam =
"profiles/employee eq 'test1' and id eq 'test'";
String restUrl = URLEncoder.encode(queryParam);*
warning: encode(java.lang.String)' is deprecated
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。