作为模板实参的模板函数

  • 本文关键字:函数 实参 c++ c++20
  • 更新时间 :
  • 英文 :


如何使下面的伪代码编译?

#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>();
}

CopyVectorCopyVectorAsync是用不同的算法复制T类型元素的某个向量的函数。Test函数调用具有不同元素类型的给定复制函数。main函数对所有元素类型调用CopyVectorCopyVectorAsync

模板参数不能接受函数模板,只能接受类模板。幸运的是,我们可以创建一个类似于函数的类。

#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>(); });
}

最新更新