[英]C++ - Can I make unspecified templated type (a.k.a higher-order type) as template argument?
例如,假设我们需要编写一个 function 允许用户从远程服务器获取数据,它会返回一个容器来保存它获取的所有数据。 为简单起见,让我们认为它是同步的,因此没有任何co_await
, co_yield
花哨的员工。
我希望用户可以选择 function 使用哪个容器。 例如,function 可以使用std::vector
、 std::list
甚至用户编写的容器来存储数据。
很快我意识到 function 可能可以通过 C++ 模板实现,但很快我发现模板类型应该是未指定类型而不是普通类型,即用户应该写fetchData<std::list>
,而不是fetchData<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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.