例如,让我们想象一下,我们需要编写一个函数,允许用户从远程服务器获取数据,并且它将返回一个容器,该容器保存它获取的所有数据。为了简单起见,让我们考虑一下它是同步的,因此没有任何co_await
、co_yield
高级职员。
我希望用户可以选择函数使用的容器。例如,函数可以使用std::vector
、std::list
,甚至用户写入的容器来存储数据。
很快我意识到这个函数可能可以用C++模板来实现,但很快我发现模板化的类型应该是一个未指定的类型,而不是普通类型,也就是说,用户应该写fetchFromServer<std::list>
,而不是fetchFromServer<std::list<Data>>
。我曾尝试编写以下代码段,但未能成功编译。我是用错误的方式写的,还是不可能在C++中使用未指定的模板类型。
这是我写的片段:
template<class T>
void fetchFromServer(T<std::string> &output);
template<>
void fetchFromServer(std::list<std::string> &output)
{
// Use a std::list to hold data.
}
template<>
void fetchFromServer(std::vector<std::string> &output)
{
// Use a std::vector to hold data.
}
// User can specified his own version of `fetchFromServer`.
int main()
{
std::list<std::string> lst;
fetchFromServer<std::list>(list);
std::vector<std::string> vctr;
fetchFromServer<std::vector>(vctr);
}
由于参数的原因,这有点棘手。但你可以这样做:
#include <vector>
#include <list>
#include <string>
template< template <typename T, typename... > class C, typename... Args >
void fetchFromServer(C<std::string,Args... > &output);
template<>
void fetchFromServer(std::list<std::string> &output)
{
// Use a std::list to hold data.
}
template<>
void fetchFromServer(std::vector<std::string> &output)
{
// Use a std::vector to hold data.
}
// User can specified his own version of `fetchFromServer`.
int main()
{
std::list<std::string> lst;
fetchFromServer<std::list>(lst);
std::vector<std::string> vctr;
fetchFromServer<std::vector>(vctr);
}
代码:https://godbolt.org/z/TanW9KjPf
事实上,你根本不需要这两个专业。你可以这样做:
template< template <typename T, typename... > class C, typename... Args >
void fetchFromServer(C<std::string,Args... > &output) {
output.push_back( "1" );
output.push_back( "2" );
output.push_back( "3" );
}
int main()
{
std::list<std::string> lst;
fetchFromServer(lst);
std::vector<std::string> vctr;
fetchFromServer(vctr);
}
代码:https://godbolt.org/z/KMGGvW8b1