首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板函数作为模板参数

模板函数作为模板参数
EN

Stack Overflow用户
提问于 2022-06-29 08:53:46
回答 1查看 106关注 0票数 0

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

代码语言:javascript
复制
#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

EN

回答 1

Stack Overflow用户

发布于 2022-06-29 13:08:52

不能将重载集或函数模板作为(模板)参数传递。

您可以为类传递模板参数:

代码语言:javascript
复制
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>();
}

或者用模板法传递函子。

代码语言:javascript
复制
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)>();
}

通过常规参数传递参数可能允许“更简单”的语法:

代码语言:javascript
复制
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>(); });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72798527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档