gpt4 book ai didi

c++ - 如何在不使用模板的情况下对字符串使用 Variadic Function?

转载 作者:行者123 更新时间:2023-11-30 05:09:44 27 4
gpt4 key购买 nike

我有以下模板函数:

struct ms {
template <typename... Args>
void update(string& query, Args&... args);
};

template <typename... Args>
void ms::update(string& query, Args&... args)
{
const int size = sizeof...(args);
vector<string> vec = { args... };
for (int i = 0; i < size; ++i) {
cout << query << ": " << vec[i] << endl;
}
}

但是,我想取消模板的使用,而只是将其设为一个接受一个或多个字符串参数的成员函数。我能找到的关于可变参数函数的所有文档和示例都展示了字符数组的使用,并使用 while pointer != null 来获取数组中的每个值。

如果我这样做:

void update(string& query, string&... args);

我将如何遍历 args 参数(如果有)?

最佳答案

这是一个 array_view<T> :

template<class T>
struct array_view;
template<class D>
struct array_view_base;

template<class T>
struct array_view_base<array_view<T>> {
T* b=0; T* e=0;
T* begin() const { return b; }
T* end() const { return e; }
T& operator[](std::size_t i)const{ return begin()[i]; }
std::size_t size() const { return end()-begin(); }
T& front() const { return *begin(); }
T& back() const { return *(end()-1); }
array_view<T> without_front( std::size_t N=1 ) const {
N=(std::min)(N, size());
return {begin()+N, end()};
}
array_view<T> without_back( std::size_t N=1 ) const {
N=(std::min)(N, size());
return {begin(), end()-N};
}

array_view_base( T* s, T* f ):b(s),e(f){}
array_view_base( T* s, std::size_t sz ):array_view_base(s, s+sz) {}

template<std::size_t N>
array_view_base( T(&arr)[N] ):array_view_base(arr, N) {}
template<class C,
std::enable_if_t<!std::is_same<std::decay_t<C>, array_view<T>>{}, int> =0
>
array_view_base( C&& c ):array_view_base(c.data(), c.size()) {}
};

template<class T>
struct array_view:array_view_base<array_view<T>> {
using array_view_base<array_view<T>>::array_view_base;
};
template<class T>
struct array_view<T const>:array_view_base<array_view<T const>> {
using array_view_base<array_view<T const>>::array_view_base;
array_view( std::initializer_list<T> il ):array_view( std::addressof(*il.begin()), il.size() ) {}
};

它有点像 gsl::span<T> .它是 T 的连续范围.

不同于gsl::span<T> , array_view<T const>可以从 initializer_list<T> 构建.

有了它,您的代码应该如下所示:

struct ms {
void update(string const& query, array_view<string const> args);
};
void ms::update(string const& query, array_view<string const> args)
{
for (int i = 0; i < args.size(); ++i) {
cout << query << ": " << args[i] << endl;
}
}

你这样调用它:

ms{}.update( "Hello", {"one", "two", "three"} );

Live example .


作为一个更糟糕的例子,简单地拿一个 std::vector<std::string> .

在通话时

ms{}.update( "Hello", {"one", "two", "three"} );

也有效。与我的解决方案不同,这会导致内存分配。

关于c++ - 如何在不使用模板的情况下对字符串使用 Variadic Function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46006690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com