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

以模板函数为参数的可变模板函数
EN

Stack Overflow用户
提问于 2013-06-02 10:36:09
回答 1查看 260关注 0票数 1

我正在尝试编译以下代码:

代码语言:javascript
复制
#include <vector>
#include <array>

template <typename T>
void sort(T &container) {}

template <typename F, typename T, typename ...Tail>
void sort_containers(F sort_func, T &container, Tail &...tail) {
    sort_func(container);
    sort_containers(sort_func, tail...);
}

template <typename F, typename T>
void sort_containers(F sort_func, T &container) {
    sort_func(container);
}

int main() {
    std::vector<int> x = {1,2,3};
    std::vector<double> y = {1.0, 2.0, 3.0};
    std::array<char, 3> z = {{'d' , 'b', 'c'}};
    sort_containers(sort, x, y, z);
}

这会导致g++4.8出现以下编译器错误:

代码语言:javascript
复制
error: no matching function for call to 
‘sort_containers(<unresolved overloaded function type>, 
std::vector<int>&, std::vector<double>&, std::array<char, 3u>&)’

我知道在将模板参数传递给sort_containers时需要为sort指定模板参数,但我不确定在存在可变模板函数的情况下这是如何工作的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-02 10:44:28

template函数是函数工厂,而不是函数。它们不能直接传递。

现在,函数器可以是,并且相对简单的包装器可以将重载的函数集转换为函数器:

代码语言:javascript
复制
struct sort_functor {
   template<typename...Args>
   auto operator()(Args&&... args) const ->
   decltype(sort(std::forward<Args>(args)... ) )
   { return sort(std::forward<Args>(args)... ); }
};

它可以通过宏生成,但不能通过template生成,因为您不能传递重载集!然后将sort_functor()传递给另一个template

代码语言:javascript
复制
#define MAKE_OVERLOAD_FUNCTOR( NAME ) \
  struct CONCAT( NAME, _functor ) { \
    template<typename...Args> \
    auto operator()(Args&&... args) const -> \
    decltype(NAME(std::forward<Args>(args)... ) ) \
    { return NAME(std::forward<Args>(args)... ) } \
  };

有一种建议是通过进一步滥用[]标记来自动生成上述函数器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16879246

复制
相关文章

相似问题

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