变量模板函数,模板函数作为参数

时间:2013-06-02 02:36:09

标签: c++ templates c++11 variadic-templates

我正在尝试编译以下内容:

#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导致以下编译器错误:

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

有人建议通过进一步滥用[]令牌自动生成上述仿函数。