C++-我可以将未指定的模板类型(也称为高阶类型)作为模板参数吗



例如,让我们想象一下,我们需要编写一个函数,允许用户从远程服务器获取数据,并且它将返回一个容器,该容器保存它获取的所有数据。为了简单起见,让我们考虑一下它是同步的,因此没有任何co_awaitco_yield高级职员。

我希望用户可以选择函数使用的容器。例如,函数可以使用std::vectorstd::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

最新更新