[英]A template function as a template argument
如何使下面的伪代码编译?
#include <vector>
template <class T>
void CopyVector() { std::vector<T> v; /*...*/}
template <class T>
void CopyVectorAsync() { std::vector<T> v; /*...*/}
template <template <class> void copy()>
void Test()
{
copy<char>();
copy<short>();
copy<int>();
}
int main()
{
Test<CopyVector>();
Test<CopyVectorAsync>();
}
CopyVector
和CopyVectorAsync
是使用不同算法复制T
类型元素的某些向量的函数。 Test
function 调用具有不同元素类型的给定复制函数。 main
function 为所有元素类型调用CopyVector
和CopyVectorAsync
。
您不能有一个模板模板参数接受 function 模板,只有 class 模板。 幸运的是,我们可以制作一个看起来很像 function 的 class。
#include <vector>
template <class T>
struct CopyVector { void operator()() { std::vector<T> v; /*...*/} };
template <class T>
struct CopyVectorAsync{ void operator()() { std::vector<T> v; /*...*/} };
template <template <class> class copy>
void Test()
{
copy<char>{}();
copy<short>{}();
copy<int>{}();
}
int main()
{
Test<CopyVector>();
Test<CopyVectorAsync>();
}
您不能将重载集或函数模板作为(模板)参数传递。
您可以为类传递模板模板参数:
template <template <class> class copy>
void Test()
{
copy<char>{}();
copy<short>{}();
copy<int>{}();
}
template <class T>
struct CopyVector
{
void operator()() const{ /*...*/}
};
int main()
{
Test<CopyVector>();
}
或通过模板方法传递函子。
template <typename copy>
void Test()
{
copy{}.template operator()<char>();
copy{}.template operator()<short>();
copy{}.template operator()<int>();
}
template <class T>
void CopyVector() { /*...*/}
int main()
{
auto lambda = []<typename T>(){ CopyVector<T>(); };
Test<decltype(lambda)>();
}
通过常规参数传递参数可能允许“更简单”的语法:
template <typename T>
void Test(T f)
{
f(std::type_identity<char>{});
f(std::type_identity<short>{});
f(std::type_identity<int>{});
}
template <class T>
void CopyVector(std::type_identity<T>) { /*...*/}
int main()
{
Test([]<typename T>(std::type_identity<T>){ CopyVector<T>(); });
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.